在剛開始接觸 iOS 開發時,最常遇到的就是閉包,但當時對閉包很陌生,也不了解實際的用途為何,於是查了很多資料,才對閉包的概念跟實際用途有更進一步的了解。閉包的內容分為以下所述:
今天內容會介紹前兩項,後三項會放在明天的內容。
在學習 Swift 的過程中,閉包 (closure) 是一定需要了解的概念,閉包簡易來說就是一種匿名函式 (function)。
一門程式語言要支援閉包的前提有兩個。
閉包採用以下三種形式之一:
在 Apple 的官方文件中寫到閉包表達語法 (Closure Expression Syntax) 為:
{ (parameters) -> return type in
statements
}
先用函式寫個簡單的功能,輸入一組陣列,回傳陣列的條件為比某值小。
func filterLessThanValue(value: Int, numbers: [Int]) -> [Int] {
var filterArray = [Int]()
for num in numbers {
if num < value {
filterArray.append(num)
}
}
return filterArray
}
此時若要改變以上函式的功能,例如改輸出為比某值大,就必須進入函式內修改,以下將利用閉包可將程式變得更為彈性。
// 將傳入參數改為閉包
func filterWithClosure(closure: (Int) -> Bool, numbers: [Int]) -> [Int] {
var filterNumbers = [Int]()
for num in numbers {
if closure(num) {
filterNumbers.append(num)
}
}
return filterNumbers
}
// 可在呼叫函式時直接更改判斷的條件
let filterList = filterWithClosure(closure: { (num) -> Bool in
return num < 5
}, numbers: [1, 2, 3, 4, 5, 10])
尾隨閉包是一種表達式,當傳入的閉包運算式很長,為了增加程式的可讀性,並將閉包放在傳入值的尾端,所用的表達式,就稱為尾隨閉包。
func someFunctionThatTakesAClosure(number: Int, closure: () -> Void) {
// 函式的功能
}
// 呼叫函式時使用非尾隨閉包
someFunctionThatTakesAClosure(number: 10, closure: {
// 閉包內容
})
// 呼叫函式時使用尾隨閉包
someFunctionThatTakesAClosure(number: 10) {
// 尾隨閉包內容
}
匿名函式的部分有些誤會喔,wiki:
匿名函式(英語:Anonymous Function)在電腦編程中是指一類無需定義識別碼(函式名)的函式或子程式,普遍存在於多種程式語言中。
比較簡單完整的 Swift 實作
let number = { (x:Int, y:Int) -> Int in
return x + y
}(0, 1)