swift文件筆記(七) -- 閉包(Closures)
閉包是自包含的函式程式碼塊,可以在程式碼中被傳遞和使用。Swift中的閉包與 C和 Objective-C中的程式碼塊(b
locks)以及其他一些程式語言中的匿名函式比較相似。函式和閉包都是引用型別。
1.閉包表示式語法
閉包表示式語法有如下的一般形式:
{ (parameters) -> returnType in
statements
}
如果閉包的函式體很短,可以將其改成一行程式碼並縮寫成如下形式:
reversedNames = names.sorted(by: { s1, s2 in s1 > s2 } )
閉包的引數名稱可以縮寫,你可以直接通過reversedNames = names.sorted(by: { $0 > $1 } )
2.尾隨閉包
如果你需要將一個很長的閉包表示式作為最後一個引數傳遞給函式,可以使用尾隨閉包來增強函式的可讀性。尾
隨閉包是一個書寫在函式括號之後的閉包表示式,函式支援將其作為最後一個引數呼叫。在使用尾隨閉包時,你
不用寫出它的引數標籤:
func someFunctionThatTakesAClosure(closure: () -> Void) {
// 函式體部分
}
// 以下是不使用尾隨閉包進行函式呼叫
someFunctionThatTakesAClosure(closure: {
// 閉包主體部分
})
// 以下是使用尾隨閉包進行函式呼叫
someFunctionThatTakesAClosure() {
// 閉包主體部分
}
3.逃逸閉包
當一個閉包作為引數傳到一個函式中,但是這個閉包在函式返回之後才被執行,我們稱該閉包從函式中逃逸。在引數名之前標註 @escaping ,用來指明這個閉包是允許“逃逸”出這個函式的。
var completionHandlers: [() -> Void] = []
func someFunctionWithEscapingClosure(
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!"