From cabdb73e01b26d8bd49e88f0bd4bfec2f6f022fb Mon Sep 17 00:00:00 2001 From: AceVest Date: Sun, 19 Jun 2016 23:44:43 +0800 Subject: [PATCH] closure --- .../Closure.xcplaygroundpage/Contents.swift | 77 +++++++++++++++++- .../UserInterfaceState.xcuserstate | Bin 13902 -> 14532 bytes 2 files changed, 73 insertions(+), 4 deletions(-) diff --git a/learn/AcePlay/AcePlay.playground/Pages/Closure.xcplaygroundpage/Contents.swift b/learn/AcePlay/AcePlay.playground/Pages/Closure.xcplaygroundpage/Contents.swift index 66a43a8..cd5b70d 100644 --- a/learn/AcePlay/AcePlay.playground/Pages/Closure.xcplaygroundpage/Contents.swift +++ b/learn/AcePlay/AcePlay.playground/Pages/Closure.xcplaygroundpage/Contents.swift @@ -24,7 +24,7 @@ import UIKit */ -let company = ["Tencent", "Apple", "Facebook", "Google", "Twitter", "Amazon"] +var company = ["Tencent", "Apple", "Facebook", "Google", "Twitter", "Amazon"] var sortedCompany: [String] = [] printLine("Sort") @@ -120,11 +120,80 @@ func makeIncrementer(step:Int) -> () -> Int { return inc } -var closureFuncA = makeIncrementer(1) +// 闭包是引用类型 +let closureFuncA = makeIncrementer(1) print("ClosureFuncA:", closureFuncA()) print("ClosureFuncA:", closureFuncA()) -var closureFuncB = closureFuncA +let closureFuncB = closureFuncA print("ClosureFunnB:", closureFuncB()) -var closureFuncC = makeIncrementer(1) +let closureFuncC = makeIncrementer(1) print("ClosureFuncC:", closureFuncC()) + +// 逃逸&非逃逸闭包 +printLine("Noescaping & Escaping Closesure") +func noescapingClosure(@noescape closure: () -> Void) { + closure() +} + +var closureHandler: Array<() -> Void> = [] +func escapingClosure(closure: () -> Void) { // 此时参数前加@noescape会报错 + closureHandler.append(closure) +} + + +class ClosureClass { + var x = 10 + func doSomethingAboutEscape() { + noescapingClosure() { x = 200 } // 将参数标记为@noescape能在闭包中隐式地引用self + escapingClosure() { self.x = 100 } + } +} + +var closureInstance = ClosureClass() +closureInstance.doSomethingAboutEscape() +print(closureInstance.x) +closureHandler[0]() +print(closureInstance.x) + + +printLine("AutoClosure") +print("Now Company Items:", company) +print("Company Item Count:", company.count) +// autoClosureHanlerA的type是 () -> String 不是 String +let autoClosureHandlerA = { company.removeAtIndex(0) } // an autoclosure lets you delay evaluation +print("Company Item Count:", company.count) +print("No Remove \(autoClosureHandlerA())") +print("Company Item Count:", company.count) + + +// autoclosure parameter +printLine("AutoClosure Parameter") +func autoClosureFuncParameterA(closure: () -> String) { + print("AutoClosureFuncParameterA \(closure())!") +} +autoClosureFuncParameterA({ company.removeAtIndex(0) }) + +func autoClosureFuncParameterB(@autoclosure closure: () -> String) { + print("AutoClosureFuncParameterB \(closure())!") +} +autoClosureFuncParameterB(company.removeAtIndex(0)) + +// @autoclosure 暗含了 noescape 特性 +var autoClosureHanlder: [() -> String] = [] +func autoClosureFuncParameterC(@autoclosure closure: () -> String) { + //因为参数被@autoclosure修饰了,而@autoclosure暗含@noescape特性,因此以下语句会报错 + //autoClosureHanlder.append(closure) +} + +// 如果用了@autoclosure又要用escape特性,则用@autoclosure(escaping)修饰参数 +func autoClosureFuncParameterD(@autoclosure(escaping) closure: () ->String) { + print("Called autoClosureFuncParameterD") + autoClosureHanlder.append(closure) +} +autoClosureFuncParameterD(company.removeAtIndex(0)) +autoClosureFuncParameterD(company.removeAtIndex(0)) + +for handler in autoClosureHanlder { + print("autoClosure Handling \(handler())!") +} 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 5f08ca2a96df821454713de6a53f5ff0e5314444..1bafc59b124ca6ef98ca7707abd10100e270d426 100644 GIT binary patch delta 7969 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 Jmp_#Z{|AHnS0MlZ -- 2.47.0