swift 逃逸閉包和非逃逸閉包的區別


swift 逃逸閉包和非逃逸閉包的區別

 

逃逸閉包:閉包做為函數的參數傳遞時,在函數體結束后被調用,我們就說這個閉包逃離了這個函數體的作用域,這個閉包是逃逸型的閉包,使用@escaping來標注。

非逃逸型的閉包:在函數體結束前被調用,閉包是非逃逸型的閉包。

 

class NetworkManger {
    
    func getUserInfo(phone: String?, success:@escaping (() -> Void), failure: ((_ errorMessage: String) -> Void)) {
        print("函數開始執行")
        guard let _ = phone else {
            print("執行了failure閉包")
            failure("電話號碼不能為空")
            return
        }
        //用來模擬網絡請求
        let dataTask = URLSession.shared.dataTask(with: URL.init(string: "www.baidu.com")!) { (data, responmse, nil) in
            print("執行了success閉包")
            success()
        }
        dataTask.resume()
        print("函數執行結束")
    }
}

let netManger = NetworkManger()
netManger.getUserInfo(phone: "123456", success: {
    print("刷新你的界面")
}) { (errorMessage) in
    print(errorMessage)
}

 

說明:
failure會在phone號碼為空的時候觸發,這個時候函數體未執行完畢,是非逃逸閉包。
success閉包是在一個異步線程中,當異步線程執行完畢后,我們才調用了success閉包,此時函數體已經執行完畢了,是逃逸閉包。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM