我是Swift的新手,當我遇到轉義關閉時,我正在閱讀手冊。我沒有得到手冊的描述。有人能夠簡單地向我解釋Swift中的轉義閉包嗎?Swift中的轉義關閉
回答
考慮這個類:
class A {
var closure: (() -> Void)?
func someMethod(closure:() -> Void) {
self.closure = closure
}
}
someMethod
分配傳入的關閉,在類的屬性。
現在,這裏是另一個類:
class B {
var number = 0
var a: A = A()
func anotherMethod() {
a.someMethod { self.number = 10 }
}
}
如果我打電話anotherMethod
,關閉{ self.number = 10 }
將被存儲在A
實例。由於self
在關閉中被捕獲,因此A
的實例也將對其進行強有力的引用。
這基本上是一個逃脫關閉的例子!
你可能想知道,「什麼?那麼封閉從哪裏逃出來?
閉包從方法的範圍轉移到類的範圍。它可以稍後調用,即使在另一個線程上!如果處理不當,這可能會導致問題。
爲了避免意外逃脫倒閉,造成保留週期和其它問題,請使用@noescape
屬性:
class A {
var closure: (() -> Void)?
func someMethod(@noescape closure:() -> Void) {
}
}
現在,如果你嘗試寫self.closure = closure
,它不編譯!
更新:
在斯威夫特3,關閉所有參數無法在默認情況下逃生。您必須添加@escaping
屬性才能使閉包能夠從當前範圍轉義。這爲您的代碼增加了更多的安全性!
class A {
var closure: (() -> Void)?
func someMethod(closure: @escaping() -> Void) {
}
}
非常感謝。這真的有幫助。 –
如果您認爲我的回答可以回答您的問題,請考慮點擊該複選標記來接受它@NikhilSridhar – Sweeper
對此答案的讚美!用簡單的方式解釋一個簡單的答案。 –
I find this website very helpful on that matter 簡單的解釋是:
如果關閉作爲參數傳遞給函數,並調用它 在函數返回之後,將封閉件逃逸。
閱讀更多在我通過上面的鏈接! :)
我正在採取更簡單的方式。
考慮這個例子:
func testFunctionWithNonescapingClosure(closure:() -> Void) {
closure()
}
上面是一個非閉合逸出,因爲封閉件是 方法返回之前調用。
考慮相同的例子與asynchoronous操作:
func testFunctionWithEscapingClosure(closure:@escaping() -> Void) {
DispatchQueue.main.async {
closure()
}
}
上面的例子包含一個逸出閉合因爲由於異步操作的函數返回之後的閉合調用可能發生。
var completionHandlers: [() -> Void] = []
func testFunctionWithEscapingClosure(closure: @escaping() -> Void) {
completionHandlers.append(closure)
}
在上述情況中可以很容易地實現封閉件外側移動功能的 體所以它需要有一個逸出閉合。
逃離並添加編譯器優化斯威夫特3.您可以搜索nonescaping
封閉的優勢不逃避關閉。
這也是一個很好的做法,可以給這個好的答案增加非易失性閉包的優點,以及可以在需要時使用的示例。 –
- 1. Swift中操作符的轉義關閉
- 2. 在Swift中轉義零閉合定義
- 3. 在Swift中關閉?
- 4. 關閉Symfony 2 /樹枝中的轉義
- 5. 使用轉義關閉值
- 6. 帶轉義鍵的關閉菜單
- 7. DispatchQueue.main.async中的轉義閉包設置視圖Swift 3
- 8. 關閉中的Swift傳入變量
- 9. 不能關閉Swift 3.0中的MFMailComposeViewController
- 10. jQuery使用轉義鍵關閉切換
- 11. DispatchQueue.main.async不調用轉義關閉
- 12. 如何在Swift中自動關閉alertview?
- 13. 瞭解Swift的關閉類型要求
- 14. URL中的轉義字符 - iOS Swift
- 15. iOS Swift不能關閉avplayer模式
- 16. Swift 3 AVfoundation - 無法關閉相機
- 17. Swift 3:關閉彈出窗口ViewController
- 18. Swift Popover關閉時觸摸背景
- 19. 禁用關閉背景Tap Pop Swift
- 20. 呼叫關閉導致Swift出錯
- 21. Swift - 關閉搜索控制器
- 22. Swift:無法讓UITextField關閉鍵盤
- 23. Swift - 自動轉義字符
- 24. matlab反轉關閉樞軸
- 25. 360旋轉關閉設置
- 26. 閉環中的javascript關閉
- 27. Python /關閉未定義
- 28. 關閉定義和示例
- 29. 如何從關閉中定義函數
- 30. 在Swift中處理窗口的關閉事件
引用手冊,「當閉包被作爲參數傳遞給函數,但在函數返回後被調用時,閉包被認爲是轉義函數。」因此,如果閉包被同步調用,非轉義。一個例子可能是枚舉閉包,或者'map','filter'等功能方法。如果它是異步調用的(即,稍後),它將被轉義。轉義閉包最常見的例子是一些緩慢異步任務的完成處理程序,如網絡請求。 – Rob
如果您認爲我的答案回答了您的問題,請考慮點擊該複選標記來接受。 – Sweeper