From dac6f8844dc9eb13de6cb422b2bf7b8ed8ca4e5a Mon Sep 17 00:00:00 2001 From: acevest Date: Wed, 8 Mar 2017 13:29:46 +0800 Subject: [PATCH] ... --- .../Closure.xcplaygroundpage/Contents.swift | 35 +++++++++++++++--- .../Contents.swift | 19 +++++++--- .../AcePlay.playground/Sources/Utils.swift | 2 +- .../UserInterfaceState.xcuserstate | Bin 21477 -> 20863 bytes 4 files changed, 44 insertions(+), 12 deletions(-) diff --git a/learn/AcePlay/AcePlay.playground/Pages/Closure.xcplaygroundpage/Contents.swift b/learn/AcePlay/AcePlay.playground/Pages/Closure.xcplaygroundpage/Contents.swift index 6957e7e..af95109 100644 --- a/learn/AcePlay/AcePlay.playground/Pages/Closure.xcplaygroundpage/Contents.swift +++ b/learn/AcePlay/AcePlay.playground/Pages/Closure.xcplaygroundpage/Contents.swift @@ -63,6 +63,22 @@ sortedCompany = company.sorted(by: { $0 > $1 }) print(sortedCompany) sortedCompany = [] + +// 尾随闭包 +// 尾随闭包是一个书写在`函数括号之后`的闭包表达式,函数支持将其作为最后一个参数调用 +// 在使用尾随闭包时,不用写出它的参数标签 + +printLine("Trailing Closures") +sortedCompany = company.sorted() { $0 > $1} +print(sortedCompany) +sortedCompany = [] + +// 如果闭包表达式是函数或方法的唯一参数,在使用尾随闭包时,可以把`()`省掉 +sortedCompany = company.sorted { $0 > $1 } +print(sortedCompany) +sortedCompany = [] + + /* There’s actually an even shorter way to write the closure expression above. Swift’s String type defines its string-specific implementation of the greater-than operator (>) as a function that has two parameters of type String, and returns a value of type Bool. This exactly matches the function type needed by the sort(_:) method. Therefore, you can simply pass in the greater-than operator, and Swift will infer that you want to use its string-specific implementation: */ @@ -121,7 +137,7 @@ func makeIncrementer(_ step:Int) -> () -> Int { } // 闭包是引用类型 -let closureFuncA = makeIncrementer(1) +let closureFuncA = makeIncrementer(2) print("ClosureFuncA:", closureFuncA()) print("ClosureFuncA:", closureFuncA()) let closureFuncB = closureFuncA @@ -131,13 +147,16 @@ print("ClosureFuncC:", closureFuncC()) // 逃逸&非逃逸闭包 +// 当一个闭包作为参数传到一个函数中,但是这个闭包在函数返回之后才被执行,则称该闭包从函数中逃逸 +// 可以在定义参数时,在参数名前标注@escaping来指明这个闭包是允许逃逸出这个函数的 + printLine("Noescaping & Escaping Closesure") func noescapingClosure(_ closure: () -> Void) { closure() } var closureHandler: Array<() -> Void> = [] -func escapingClosure(_ closure: @escaping () -> Void) { // 此时参数前加@noescape会报错 +func escapingClosure(_ closure: @escaping () -> Void) { // 此时参数前加@noescape会报错 closureHandler.append(closure) } @@ -146,23 +165,26 @@ class ClosureClass { var x = 10 func doSomethingAboutEscape() { noescapingClosure() { x = 200 } // 将参数标记为@noescape能在闭包中隐式地引用self - escapingClosure() { self.x = 100 } + escapingClosure() { self.x = 100 } // 将一个闭包参数标记为@escaping意味着必须在闭包中显式地引用self } } var closureInstance = ClosureClass() closureInstance.doSomethingAboutEscape() print(closureInstance.x) -closureHandler[0]() + +closureHandler[0]() // 两种调用逃逸闭包的方法 +closureHandler.first?() print(closureInstance.x) +// 自动闭包 printLine("AutoClosure") print("Now Company Items:", company) print("Company Item Count:", company.count) // autoClosureHanlerA的type是 () -> String 不是 String let autoClosureHandlerA = { company.remove(at: 0) } // an autoclosure lets you delay evaluation -print("Company Item Count:", company.count) +print("Company Item Count:", company.count) // 在自动闭包被调用前,值不会变 print("No Remove \(autoClosureHandlerA())") print("Company Item Count:", company.count) @@ -177,6 +199,9 @@ autoClosureFuncParameterA({ company.remove(at: 0) }) func autoClosureFuncParameterB(_ closure: @autoclosure () -> String) { print("AutoClosureFuncParameterB \(closure())!") } + +// 用@autoclosure修饰参数 可以在调用的时候少写一对`{}` +// 过度使用@autoclosure会让代码变得难以理解 autoClosureFuncParameterB(company.remove(at: 0)) // @autoclosure 暗含了 noescape 特性 diff --git a/learn/AcePlay/AcePlay.playground/Pages/Enumerations.xcplaygroundpage/Contents.swift b/learn/AcePlay/AcePlay.playground/Pages/Enumerations.xcplaygroundpage/Contents.swift index 3ce322c..4510d24 100644 --- a/learn/AcePlay/AcePlay.playground/Pages/Enumerations.xcplaygroundpage/Contents.swift +++ b/learn/AcePlay/AcePlay.playground/Pages/Enumerations.xcplaygroundpage/Contents.swift @@ -3,14 +3,14 @@ import UIKit enum CompassPoint { - case north + case north // 也可以写在一行上用逗号隔开 north, east, south, west case east case south case west } -var directionToHead = CompassPoint.north -directionToHead = .east +var directionToHead = CompassPoint.north // 自动推断类型 +directionToHead = .east // 一旦类型确定,再次赋值时可以省略枚举类型名 switch directionToHead { case .north: print("Losts of Plantes Have a North") @@ -49,7 +49,7 @@ enum ASCIIControlCharacter: Character { // Implicitly Assigned Raw Values // 整型从0开始自增1,每个项的rawValue不能相同 enum Planet: Int { - case mercury + case mercury // 从0开始,后续自增1,也可以指定值 如 mercury=1 case venus case earth case mars @@ -59,17 +59,22 @@ enum Planet: Int { case netpune } + print(Planet.mercury, Planet.mercury.rawValue) print(Planet.mars, Planet.mars.rawValue) + +// 使用原始值初始化枚举实例 +let possiblePlanet: Planet? = Planet(rawValue: 7) // 注意是可选类型 Planet? +print(possiblePlanet!, possiblePlanet!.rawValue) print(Planet(rawValue: 5)!, Planet(rawValue: 5)!.rawValue) // String型,每项默认为枚举项的字符串值 enum CompassPointString: String { - case North + case North // String原始值默认与枚举成员名相同 case East case Sourth - case West + case West = "WEAST" } @@ -79,6 +84,8 @@ print(CompassPointString.Sourth,CompassPointString.Sourth.rawValue) print(CompassPointString.West, CompassPointString.West.rawValue) + +// 递归枚举 printLine("Resursive Enumerations") // 不能忘记 indirect indirect enum Exp { diff --git a/learn/AcePlay/AcePlay.playground/Sources/Utils.swift b/learn/AcePlay/AcePlay.playground/Sources/Utils.swift index 8c6499a..17f7185 100644 --- a/learn/AcePlay/AcePlay.playground/Sources/Utils.swift +++ b/learn/AcePlay/AcePlay.playground/Sources/Utils.swift @@ -2,6 +2,6 @@ import UIKit public func printLine(_ title: String) -> Void { - let line = String(format:"[%@]-----------------------------------", title) + let line = String(format:"-----------------------------------<%@>", title) print(line) } diff --git a/learn/AcePlay/AcePlay.playground/playground.xcworkspace/xcuserdata/Ace.xcuserdatad/UserInterfaceState.xcuserstate b/learn/AcePlay/AcePlay.playground/playground.xcworkspace/xcuserdata/Ace.xcuserdatad/UserInterfaceState.xcuserstate index fa0d0147ea01c7f18ee998865ac38ad45643b67f..a5bd0eda41a23e5c276d7a45825adfa46ff6f58d 100644 GIT binary patch literal 20863 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 OUzzdztM6~|iT?wn!;Mz} -- 2.44.0