聊一聊Swift中的閉包
我正在參加「掘金·啟航計劃」
Swift中的閉包Closure.
1 Swift中的閉包結構是什麼樣的?
{
(引數列表) -> 返回值型別 in 函式體程式碼
}
2 什麼是尾隨閉包?
- 將一個很長的閉包表示式作為函式的最後一個實參.
- 使用尾隨閉包可以增強函式的可讀性.
- 尾隨閉包是一個被書寫在函式呼叫括號外面(後面)的閉包表示式. ``` // fn就是一個尾隨閉包引數 func exec(v1: Int, v2: Int, fn: (Int, Int) -> Int) { print(fn(v1, v2)) }
// 呼叫 exec(v1: 10, v2: 20) { $0 + $1 } ```
3 什麼是逃逸閉包?
- 當閉包作為一個實際引數傳遞給一個函式或者變數的時候, 我們就說這個閉包逃逸了, 可以在形式引數前寫
@escaping
來明確閉包是允許逃逸的. - 非逃逸閉包、逃逸閉包, 一般都是當做引數傳遞給函式.
- 非逃逸閉包: 閉包呼叫發生在函式結束前, 閉包呼叫在函式作用域內.
- 逃逸閉包: 閉包有可能在函式結束後呼叫, 閉包呼叫逃逸出了函式的作用域, 需要通過
@escaping
宣告. ``` // 定義一個數組用於儲存閉包型別 var completionHandlers: [() -> Void] = []
// 在方法中將閉包當做實際引數, 儲存到外部變數中
func someFunctionWithEscapingClosure(completionHandler: @escaping () -> Void) {
completionHandlers.append(completionHandler)
}
``
- **上面這種情況, 如果不標記函式的形式引數為
escaping`, 就會編譯報錯.**
4 什麼是自動閉包?
- 自動閉包是一種自動建立的用來把作為實際引數傳遞給函式的表示式打包的閉包.
- 它不接受任何實際引數, 並且當它被呼叫時, 它會返回內部打包的表示式的值.
- 這個語法的好處在於通過寫普通表示式代替顯式閉包而使你省略包圍函式形式引數的括號.
func getFirstPositive(_ v1: Int, _ v2: @autoclosure () -> Int) -> Int? { return v1 > 0 ? v1 : v2() } getFirstPositive(10, 20)
- 為了避免與期望衝突, 使用了
@autoclosure
的地方最好明確註釋清楚: 這個值會被推遲執行. @autoclosure
會自動將20封裝成閉包{ 20 }
@autoclosure
只支援()->T
格式的引數@autoclosure
並非只支援最後一個引數- 有
@autoclosure
、無@autoclosure
, 構成了函式過載.
發文不易, 喜歡點讚的人更有好運氣👍 :), 定期更新+關注不迷路~
ps:歡迎加入筆者18年建立的研究iOS稽核及前沿技術的三千人扣群:662339934,坑位有限,備註“掘金網友”可被群管通過~
「其他文章」
- iOS老司機聊聊實際專案開發中的<<人月神話>>
- iOS老司機可落地在中大型iOS專案中的5大接地氣設計模式合集
- iOS老司機的跨端跨平臺Hybrid開發Tips
- iOS老司機的2022年回顧, 聊聊寒冬下的實用<<談判力>>
- iOS老司機可落地的中大型iOS專案中的設計模式優化Tips_橋接模式
- iOS老司機的多執行緒PThread學習分享
- iOS老司機整理, iOSer必會的經典演算法_2
- iOS老司機的<<藍海轉型>>讀書分享
- iOS老司機的<<程式設計師的自我修養:連結、裝載與庫>>讀書分享
- iOS老司機的接地氣演算法Tips
- iOS老司機的RunLoop原理探究及實用Tips
- iOS老司機整理, iOSer必會的經典演算法_1
- iOS老司機的App啟動優化Tips, 讓啟動速度提升10%
- iOS老司機的網路相關Tips
- 戀上資料結構與演算法
- iOS老司機帶你一起把App的崩潰率降到0.1%以下
- 探究Swift的String底層實現
- iOS老司機萬字整理, 可能是最全的Swift Tips
- iOS老司機可落地的中大型iOS專案中的設計模式優化Tips
- 聊一聊Swift中的閉包