官术网_书友最值得收藏!

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)  {
     }
主站蜘蛛池模板: 阿瓦提县| 临清市| 松阳县| 平江县| 九江县| 瑞昌市| 彰化市| 凤冈县| 胶南市| 寿阳县| 乐东| 古蔺县| 江西省| 石家庄市| 宽城| 平顺县| 怀安县| 麟游县| 来安县| 四子王旗| 丽江市| 滨海县| 桦甸市| 靖远县| 乐山市| 吴旗县| 鞍山市| 东兰县| 自治县| 红河县| 神池县| 西青区| 望江县| 滕州市| 沂水县| 天气| 凌海市| 隆尧县| 西宁市| 清水县| 廉江市|