1. 程式人生 > >swift文件筆記(七) -- 閉包(Closures)

swift文件筆記(七) -- 閉包(Closures)

閉包是自包含的函式程式碼塊,可以在程式碼中被傳遞和使用。Swift中的閉包與 C Objective-C中的程式碼塊(

locks)以及其他一些程式語言中的匿名函式比較相似。函式和閉包都是引用型別。

1.閉包表示式語法

閉包表示式語法有如下的一般形式:

{ (parameters) -> returnType in

     statements

如果閉包的函式體很短,可以將其改成一行程式碼並縮寫成如下形式:

reversedNames = names.sorted(by: { s1, s2 in s1 > s2 } )

閉包的引數名稱可以縮寫,你可以直接通過
$0 $1 $2來順序呼叫閉包的引數,以此類推。

reversedNames = names.sorted(by: { $0 > $1 } ) 

2.尾隨閉包

如果你需要將一個很長的閉包表示式作為最後一個引數傳遞給函式,可以使用尾隨閉包來增強函式的可讀性。尾

隨閉包是一個書寫在函式括號之後的閉包表示式,函式支援將其作為最後一個引數呼叫。在使用尾隨閉包時,你

不用寫出它的引數標籤:

func someFunctionThatTakesAClosure(closure: () -> Void)

// 函式體部分 

// 以下是不使用尾隨閉包進行函式呼叫

 

someFunctionThatTakesAClosure(closure: { 

// 閉包主體部分

})

// 以下是使用尾隨閉包進行函式呼叫 

someFunctionThatTakesAClosure()

// 閉包主體部分

3.逃逸閉包

當一個閉包作為引數傳到一個函式中,但是這個閉包在函式返回之後才被執行,我們稱該閉包從函式中逃逸。在引數名之前標註 @escaping ,用來指明這個閉包是允許“逃逸”出這個函式的。

var completionHandlers: [() -> Void] = []

func someFunctionWithEscapingClosure(

completionHandler: @escaping () -> Void) {

    completionHandlers.append(completionHandler)

}


4.自動閉包

自動閉包是一種自動建立的閉包,用於包裝傳遞給函式作為引數的表示式。這種閉包不接受任何引數,當它被調

用的時候,會返回被包裝在其中的表示式的值。這種便利語法讓你能夠省略閉包的花括號,用一個普通的表示式

來代替顯式的閉包。(感角沒什麼用,而且會讓程式碼很難懂)

//自動閉包前

 // customersInLine is ["Alex", "Ewa", "Barry", "Daniella"]

 func serve(customer customerProvider: () -> String) {

     print("Now serving \(customerProvider())!")

 }

serve(customer: { customersInLine.remove(at: 0) } ) // 打印出 "Now serving Alex!" 

//自動閉包後

// customersInLine is ["Ewa", "Barry", "Daniella"]

 func serve(customer customerProvider: @autoclosure () -> String) {

     print("Now serving \(customerProvider())!")

 }

serve(customer: customersInLine.remove(at: 0)) // 列印 "Now serving Ewa!"