From 5934fb2aea3bc3060354dd43bc8048f47a1ccca7 Mon Sep 17 00:00:00 2001 From: jiulinxiri Date: Fri, 7 Jan 2022 22:16:23 +0800 Subject: [PATCH] =?UTF-8?q?=E9=97=AD=E5=8C=85=E5=B1=9E=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 08 类.playground/Resources/README.md | 8 ++ 09 闭包.playground/Contents.swift | 121 ++++++++++++++++++ 09 闭包.playground/contents.xcplayground | 4 + .../contents.xcworkspacedata | 7 + .../UserInterfaceState.xcuserstate | Bin 0 -> 11922 bytes 10 属性 inout.playground/Contents.swift | 20 +++ .../Resources/README.md | 32 +++++ .../contents.xcplayground | 4 + .../contents.xcworkspacedata | 7 + .../UserInterfaceState.xcuserstate | Bin 0 -> 14675 bytes 10 files changed, 203 insertions(+) create mode 100644 09 闭包.playground/Contents.swift create mode 100644 09 闭包.playground/contents.xcplayground create mode 100644 09 闭包.playground/playground.xcworkspace/contents.xcworkspacedata create mode 100644 09 闭包.playground/playground.xcworkspace/xcuserdata/jiulinxiri.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 10 属性 inout.playground/Contents.swift create mode 100644 10 属性 inout.playground/Resources/README.md create mode 100644 10 属性 inout.playground/contents.xcplayground create mode 100644 10 属性 inout.playground/playground.xcworkspace/contents.xcworkspacedata create mode 100644 10 属性 inout.playground/playground.xcworkspace/xcuserdata/jiulinxiri.xcuserdatad/UserInterfaceState.xcuserstate diff --git a/08 类.playground/Resources/README.md b/08 类.playground/Resources/README.md index 1ceb02c..91a660b 100644 --- a/08 类.playground/Resources/README.md +++ b/08 类.playground/Resources/README.md @@ -142,3 +142,11 @@ var p = Point() class_getInstanceSize(type(of: p)) // 40 class_getInstanceSize(Point.self) // 40 ``` +#### 对象中的方法 + +方法占用对象的内存吗? + +* 不占用 +* 方法的本质是函数 +* 方法以及函数都放在代码段 + diff --git a/09 闭包.playground/Contents.swift b/09 闭包.playground/Contents.swift new file mode 100644 index 0000000..2d081d0 --- /dev/null +++ b/09 闭包.playground/Contents.swift @@ -0,0 +1,121 @@ +import UIKit + +var greeting = "Hello, playground" + +/*: + swift 中可以通过 func 定义一个函数,也可以通过闭包表达式创建一个函数。 + + 闭包表达式(Closure Expression) + - 闭包表达式的格式 + { + (参数列表) -> 返回值类型 in + 函数体代码 + } + + - 闭包表达式的简写 + + 尾随闭包: 尾随闭包是一个被书写在函数调用括号外面(后面)的闭包表达式 + - 如果将一个很长的闭包表达式作为函数的最后一个实参,使用尾随闭包可以增强函数的可读性 + - 如果闭包表达式是函数的唯一实参,而且使用了尾随闭包的语法,那就不需要在函数名后边写圆括号 + + + 闭包(Closure) + - 一个函数和它所捕获的变量\常量环境组合起来,称为闭包 + - 一般指定义在函数内部的函数 + - 一般它捕获的是外层函数的局部变量\常量 + + - 可以把闭包想象成是一个类的实例对象 + - 内存在堆空间 + - 捕获的局部变量\常量就是对象的成员(存储属性) + - 组成闭包的函数就是类内部定义的方法 + + class Closure { + var num = 0 + func plus(_ i: Int) -> Int { num += i + return num + } + } + var cs1 = Closure() + var cs2 = Closure() + cs1.plus(1) // 1 + cs2.plus(2) // 2 + cs1.plus(3) // 4 + cs2.plus(4) // 6 + cs1.plus(5) // 9 + cs2.plus(6) // 12 + + + */ + +// 闭包表达式 +var fn = { + (v1: Int, v2: Int) -> Int in + return v1 + v2 +} + +print(fn(10, 20)) + +// 尾随闭包 +// 闭包表达式作为函数的最后一个实参 +func exec(v1: Int, v2: Int, fn:(Int, Int) -> Int) { + print(fn(v1, v2)) +} + +exec(v1: 10, v2: 20) { + $0 + $1 +} + +// 闭包表达式是函数的唯一实参 +func exec1(fn:(Int, Int) -> Int) { + print(fn(1, 2)) +} + +exec1(fn: {$0 + $1}) +exec1() {$0 + $1} +exec1{$0 + $1} + +// 闭包 +typealias Fn = (Int) -> Int +func getFn() -> Fn { + var num = 0 + func plus(_ i: Int) -> Int { num += i + return num + } + return plus +} // 返回的plus和num形成了闭包 + +var fn1 = getFn() // 分配堆空间 +var fn2 = getFn() // 分配另外的堆空间 +fn1(1) // 1 +fn2(2) // 2 +fn1(3) // 4 +fn2(4) // 6 +fn1(5) // 9 +fn2(6) // 12 + +// 自动闭包 +/*: + @autoclosure 会自动将 20 封装成闭包 { 20 } + @autoclosure 只支持 () -> T 格式的参数 + @autoclosure 并非只支持最后1个参数 + 空合并运算符 ?? 使用了 @autoclosure 技术 + 有@autoclosure、无@autoclosure,构成了函数重载 + */ +// 如果第1个数大于0,返回第一个数。否则返回第2个数 +func getFirstPositive(_ v1: Int, _ v2: Int) -> Int { + return v1 > 0 ? v1 : v2 +} +getFirstPositive(10, 20) // 10 +getFirstPositive(-2, 20) // 20 +getFirstPositive(0, -4) // -4 + +// 改成函数类型的参数,可以让v2延迟加载 +func getFirstPositive(_ v1: Int, _ v2: () -> Int) -> Int? { + return v1 > 0 ? v1 : v2() +} +getFirstPositive(-4) { 20 } + +func getFirstPositive(_ v1: Int, _ v2: @autoclosure () -> Int) -> Int? { return v1 > 0 ? v1 : v2() +} +getFirstPositive(-4, 20) + diff --git a/09 闭包.playground/contents.xcplayground b/09 闭包.playground/contents.xcplayground new file mode 100644 index 0000000..cf026f2 --- /dev/null +++ b/09 闭包.playground/contents.xcplayground @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/09 闭包.playground/playground.xcworkspace/contents.xcworkspacedata b/09 闭包.playground/playground.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..ca3329e --- /dev/null +++ b/09 闭包.playground/playground.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/09 闭包.playground/playground.xcworkspace/xcuserdata/jiulinxiri.xcuserdatad/UserInterfaceState.xcuserstate b/09 闭包.playground/playground.xcworkspace/xcuserdata/jiulinxiri.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..e5d8d960b804e904d0bf0bb0df7baf77e99fe503 GIT binary patch literal 11922 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 + + + \ No newline at end of file diff --git a/10 属性 inout.playground/playground.xcworkspace/contents.xcworkspacedata b/10 属性 inout.playground/playground.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..ca3329e --- /dev/null +++ b/10 属性 inout.playground/playground.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/10 属性 inout.playground/playground.xcworkspace/xcuserdata/jiulinxiri.xcuserdatad/UserInterfaceState.xcuserstate b/10 属性 inout.playground/playground.xcworkspace/xcuserdata/jiulinxiri.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..2e9ca926dac0df41c97ea191a0dc78dc7d923630 GIT binary patch literal 14675 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 T+j_{Q^8e^*@o(gJw)cMkl@3P? literal 0 HcmV?d00001