Swift-非逃逸閉包
阿新 • • 發佈:2019-01-10
非逃逸閉包 //當一個閉包作為引數傳到一個函式中,但是這個閉包在函式返回之後被執行,我們稱該閉包從函式中逃逸。當你定義接受閉包作為引數的函式時,可以在引數名之前標註@noescape,用來指明這個閉包是不允許“逃逸”出這個函式的。 //將閉包標註@noescape能使編譯器知道這個閉包的生命週期 //注:閉包只能在函式體中被執行,不能脫離函式體執行 func someFunctionWithNoescapeClosure(@noescape closure: () -> Void) { closure() } //一種能使閉包“逃逸”出函式的方法是,將這個閉包儲存在一個函式外部定義的變數中。這種情況下,閉包需要“逃逸”出函式,因為閉包需要在函式返回之後被呼叫。 //例: var completionHandlers: [() -> Void] = [] func someFunctionWithEscapingClosure(completionHandler: () -> Void) { completionHandlers.append(completionHandler) } //someFunctionWithEscapingClosure()函式接受一個閉包作為引數,該閉包被新增到一個函式外定義的陣列中。 //若你要是將這個引數標註為@noescape,你將會獲得一個編譯錯誤 //將閉包標註為@noescape使你能在閉包中隱式的引用self class SomeClass { var x = 10 func doSomething() { someFunctionWithEscapingClosure { self.x = 100 } someFunctionWithNoescapeClosure { x = 200 } } } let instance = SomeClass() instance.doSomething() print(instance.x) completionHandlers.first?() print(instance.x)