(一)autoclosure:
autoclosure可以把一句話自動的封裝成一個閉包。但是不支持帶有輸入參數的寫法
func autoclosure(_ check: @autoclosure ()->Bool) { if check() { print("true") } }
此時調用的時候就可以直接寫成:
autoclosure(2>3)
(二)@escaping:
在以前版本閉包的使用時不用加@escaping的。當前版本,如果閉包沒有回調參數返回值,是不需要@escaping的。但是如果閉包傳遞了參數。就會出現一種假設。那就是參數中block的內容會在函數執行返回前就完成。也就是說對於block的調用時同步的。
簡單的說 就是如果這個閉包是在這個函數結束前被調用,就是noescape。
閉包在函數執行完成后才調用,調用的地方超過了函數的范圍,就是逃逸閉包。
網絡請求后結束的回調就是逃逸的。因為發起請求后過一段時間閉包執行。
在swift3.0中所有閉包都是默認非逃逸的,無需@noescape。如果是逃逸的就@escaping表示。
延遲操作,網絡加載等都需要@escaping。
func clorse(completion:@escaping (_ json: [String])->()) { let workingQueue = DispatchQueue(label: "workingQueue") workingQueue.async { // 延遲操作 print("努力工作") Thread.sleep(forTimeInterval: 2.0) let json = ["ac","mym"] DispatchQueue.main.async { print("結束工作") // 主線程更新 回調 completion(json) } } }