聊一聊Swift中的閉包

語言: CN / TW / HK

我正在參加「掘金·啟航計劃」

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 } ```

image.png

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,坑位有限,備註“掘金網友”可被群管通過~