- Swift 4從零到精通iOS開發
- 張益琿
- 870字
- 2019-12-09 14:31:26
5.5 后置閉包、逃逸閉包與自動閉包
閉包常常會作為函數的參數來使用,函數在調動時,參數是寫在小括號中的參數列表中的,而閉包又是一個寫在大括號中的代碼塊,如此的嵌套寫法在視覺上十分不直觀。因此,Swift語言中提供了后置閉包的寫法。當函數中的最后一個參數為閉包參數時,在調用函數時,開發者可以將閉包結構脫離出函數的參數列表,追加在函數的尾部,增強代碼的可讀性,示例如下:

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

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

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

自動閉包默認為非逃逸的,若要使用逃逸類型的閉包參數,需要聲明如下:
//將閉包參數聲明為自動閉包,逃逸閉包 func myFunc2(closure: @autoclosure @escaping ()->Bool) { }
- Boost.Asio C++ Network Programming(Second Edition)
- arc42 by Example
- 技術領導力:程序員如何才能帶團隊
- C/C++常用算法手冊(第3版)
- Java Web基礎與實例教程
- 數據結構案例教程(C/C++版)
- Visual C#通用范例開發金典
- Kotlin開發教程(全2冊)
- 編程可以很簡單
- Python數據可視化之美:專業圖表繪制指南(全彩)
- PyQt編程快速上手
- Julia High Performance(Second Edition)
- Implementing Domain:Specific Languages with Xtext and Xtend
- Mastering Node.js
- 面向對象分析與設計(第3版)