1. 程式人生 > >Swift-非逃逸閉包

Swift-非逃逸閉包

非逃逸閉包
//當一個閉包作為引數傳到一個函式中,但是這個閉包在函式返回之後被執行,我們稱該閉包從函式中逃逸。當你定義接受閉包作為引數的函式時,可以在引數名之前標註@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)