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

5.5 后置閉包、逃逸閉包與自動閉包

閉包常常會作為函數的參數來使用,函數在調動時,參數是寫在小括號中的參數列表中的,而閉包又是一個寫在大括號中的代碼塊,如此的嵌套寫法在視覺上十分不直觀。因此,Swift語言中提供了后置閉包的寫法。當函數中的最后一個參數為閉包參數時,在調用函數時,開發者可以將閉包結構脫離出函數的參數列表,追加在函數的尾部,增強代碼的可讀性,示例如下:

后置閉包的語法簡化了代碼的結構,這里面還有一個小技巧,如果一個函數只有一個參數,且這個參數是一個閉包類型的參數,則開發者在調用函數時,使用后置閉包的寫法可以直接將函數的參數列表省略,示例代碼如下:

以上示例代碼幾乎是閉包的最簡形式了。

當閉包傳遞進函數時,系統會為此閉包進行內存的分配。在Swift語言中,還有逃逸閉包與非逃逸閉包這樣的概念。所謂逃逸閉包,是指函數內的閉包在函數執行結束后在函數外依然可以進行使用,非逃逸閉包是指當函數的生命周期結束后,閉包也將被銷毀。換句話說,非逃逸閉包只能在函數內部使用,在函數外部不能夠使用。默認情況下函數參數中的閉包都為非逃逸閉包,這樣做的優點是可以提高代碼性能,節省內存消耗,開發者可以根據實際需求將閉包參數聲明成逃逸閉包。

提示

非逃逸閉包也不可以作為返回值返回,如果這么做,編譯器會拋出一個錯誤。

將閉包聲明為非逃逸類型,需要使用@noescape修飾。需要注意的是,在最新版本的Xcode開發工具中,這個關鍵字已經不需要再使用,參數中的閉包默認都是非逃逸的,示例代碼如下:

提示

逃逸類型的閉包常用于異步操作中,例如一個后臺請求完成后要執行閉包回調,需要使用逃逸類型。

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

自動閉包默認為非逃逸的,若要使用逃逸類型的閉包參數,需要聲明如下:

    //將閉包參數聲明為自動閉包,逃逸閉包
    func myFunc2(closure: @autoclosure @escaping ()->Bool)  {
    }
主站蜘蛛池模板: 平顶山市| 大城县| 博野县| 榆中县| 临沭县| 渝中区| 沁水县| 五原县| 苍山县| 华蓥市| 达孜县| 迭部县| 新和县| 托里县| 子洲县| 芦山县| 平顶山市| 无棣县| 广水市| 广水市| 宜宾县| 房产| 革吉县| 阿尔山市| 含山县| 武安市| 八宿县| 隆安县| 和田县| 淳安县| 独山县| 始兴县| 明水县| 大化| 安徽省| 新野县| 石景山区| 邻水| 元阳县| 太仆寺旗| 思茅市|