- Swift 5從零到精通iOS開發訓練營
- 張益琿編著
- 866字
- 2022-07-27 18:32:14
5.5 后置閉包、逃逸閉包與自動閉包
閉包常常會作為函數的參數來使用,函數在調用時,參數是寫在小括號中的參數列表中的,而閉包又是一個寫在大括號中的代碼塊,如此的嵌套寫法在視覺上十分不直觀。因此,Swift語言中提供了后置閉包的寫法。當函數中的最后一個參數為閉包參數時,在調用函數時,開發者可以將閉包結構脫離出函數的參數列表,追加在函數的尾部,增強代碼的可讀性,示例如下:
//原結構 mySort(array: &stuArr, sortClosure: { ($0 as! Student).achievement > ($1 as! Student).achievement }) //后置閉包結構 mySort(array: &stuArr){ ($0 as! Student).achievement > ($1 as! Student).achievement }
后置閉包的語法簡化了代碼的結構,這里面還有一個小技巧,如果一個函數只有一個參數,且這個參數是一個閉包類型的參數,則開發者在調用函數時,使用后置閉包的寫法可以直接將函數的參數列表省略,示例代碼如下:

以上示例代碼幾乎是閉包的最簡形式了。
當閉包傳遞進函數時,系統會為此閉包進行內存的分配。在Swift語言中,還有逃逸閉包與非逃逸閉包這樣的概念。所謂逃逸閉包,是指函數內的閉包在函數執行結束后在函數外依然可以使用,非逃逸閉包是指當函數的生命周期結束后,閉包也將被銷毀。換句話說,非逃逸閉包只能在函數內部使用,在函數外部不能夠使用。默認情況下,函數參數中的閉包都為非逃逸閉包,這樣做的優點是可以提高代碼性能,節省內存消耗,開發者可以根據實際需求將閉包參數聲明成逃逸閉包。
提示
非逃逸閉包也不可以作為返回值返回,如果這么做,編譯器會拋出一個錯誤。
我們默認定義的閉包都是非逃逸類型,參數中的閉包默認都是非逃逸的,示例代碼如下:

提示
逃逸類型的閉包常用于異步操作中,例如一個后臺請求完成后要執行閉包回調,需要使用逃逸類型。
不是所有的閉包都需要顯式創建,Swift語言中還有一種語法,其可以實現對簡單閉包的自動生成,這種閉包通常稱為自動閉包。需要注意,自動閉包參數的使用有嚴格的條件,首先此閉包不能夠有參數,其次在調用函數傳參時,此閉包的實現只能由一句表達式組成,閉包的返回值即為此表達式的值,自動閉包參數由@autoclosure來聲明,示例代碼如下:

自動閉包默認為非逃逸的,若要使用逃逸類型的閉包參數,則需要聲明如下:
//將閉包參數聲明為自動閉包、逃逸閉包 func myFunc2(closure: @autoclosure @escaping ()->Bool) { }
- C語言程序設計基礎與實驗指導
- Python Deep Learning
- AngularJS深度剖析與最佳實踐
- PHP+MySQL網站開發項目式教程
- Windows Server 2016 Automation with PowerShell Cookbook(Second Edition)
- Python機器學習基礎教程
- 機器學習與R語言實戰
- Learning PHP 7
- Python3.5從零開始學
- Oracle GoldenGate 12c Implementer's Guide
- Visual C++從入門到精通(第2版)
- 零基礎學Java第2版
- Distributed Computing with Python
- Kotlin入門與實戰
- JavaScript程序設計基礎教程(慕課版)