1. 程式人生 > >Swift3.0通過閉包回撥傳遞引數 / @escaping

Swift3.0通過閉包回撥傳遞引數 / @escaping

//載入請求資料
func loadData(completion: @escaping (_ result:[String]) -> ()) -> () {

    DispatchQueue.global().async {
         print("耗時操作 \(Thread.current)")

     //獲取到的json結果資料
     let json = ["姓名","年齡","愛好"]

     //主佇列回撥
     DispatchQueue.main.async {
          print("主執行緒更新 UI \(Thread.current)"
) //回撥非同步獲取的結果 completion(json) } } } //呼叫: //尾隨閉包, //如果函式的最後一個引數是閉包,函式引數可以提前結束,最後一個引數直接使用{},包裝閉包的程式碼 loadData { (result) in print("獲取結果 \(result)") } //按照函式本身的格式編寫 loadData(completion: { (result) -> () in print("獲取結果 \(result)") })

注意到在loadData函式有通過智慧提示出現了一個@escaping的關鍵詞,@escaping(逃逸閉包):如果一個閉包被作為一個引數傳遞給一個函式,並且在函式return之後才被喚起執行,那麼這個閉包是逃逸閉包.並且這個閉包的引數是可以“逃出”這個函式體外的.

在swift2中,可以標記一個函式引數@noescape屬性,來告訴編譯器傳遞給這個函式的閉包不允許“逃逸”出函式體外.但是在在swift3.0中,@noescape已經被移除了.引入了@escaping.

建立預設不可逃逸閉包的好處:最明顯的好處就是編譯器優化你的程式碼的效能和能力.如果編譯器知道這個閉包是不可逃逸的,它可以關注記憶體管理的關鍵細節.

而且可以在不可逃逸閉包裡放心的使用self關鍵字,因為這個閉包總是在函式return之前執行,你不需要去使用一個弱引用去引用self.