(一)autoclosure:json
autoclosure能夠把一句話自動的封裝成一個閉包。可是不支持帶有輸入參數的寫法swift
func autoclosure(_ check: @autoclosure ()->Bool) { if check() { print("true") } }
此時調用的時候就能夠直接寫成:api
autoclosure(2>3)
(二)@escaping:網絡
在之前版本閉包的使用時不用加@escaping的。當前版本,若是閉包沒有回調參數返回值,是不須要@escaping的。可是若是閉包傳遞了參數。就會出現一種假設。那就是參數中block的內容會在函數執行返回前就完成。也就是說對於block的調用時同步的。閉包
簡單的說 就是若是這個閉包是在這個函數結束前被調用,就是noescape。async
閉包在函數執行完成後才調用,調用的地方超過了函數的範圍,就是逃逸閉包。函數
網絡請求後結束的回調就是逃逸的。由於發起請求後過一段時間閉包執行。spa
在swift3.0中全部閉包都是默認非逃逸的,無需@noescape。若是是逃逸的就@escaping表示。線程
延遲操做,網絡加載等都須要@escaping。code
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) } } }