- 閉包(Closure)在本質上等于函數,和oc的block類似
- 閉包是一種函數的簡寫形式,省去函數名,把參數和返回值放入{}內。
//語法
{(parameters) -> (return type) in
statements
}
閉包的基本演示:
let studname = { print("Swift 閉包實例。") }
studname()
var numArray = [1,3,5,6,7,0]
//sorter函數用于對數組的排序,只接受一個函數型參數,描述排序邏輯
//正序
var numArray1 = numArray.sorted()
func daoxu1(a:Int,b:Int) -> Bool {
return a > b
}
var numArray2 = numArray.sorted(by: daoxu1)
//用閉包表達式
var numArray3 = numArray.sorted { (a, b) -> Bool in
return a > b
}
numArray3
//閉包的自動推斷
//可使用快捷參數,前綴$,從0開始遞增
var numArray4 = numArray.sorted { $0 > $1}
numArray4
參數名稱縮寫:
Swift 自動為內聯函數提供了參數名稱縮寫功能,您可以直接通過
1,$2來順序調用閉包的參數。
如果你在閉包表達式中使用參數名稱縮寫, 您可以在閉包參數列表中省略對其定義, 并且對應參數名稱縮寫的類型會通過函數類型進行推斷。in 關鍵字同樣也可以被省略.
var numArray = [1,3,5,6,7,0]
var numArray4 = numArray.sorted { $0 > $1}
print(numArray4)
運算符函數
Swift 的String類型定義了關于大于號 (>) 的字符串實現,其作為一個函數接受兩個String類型的參數并返回Bool類型的值。 而這正好與sort(_:)方法的第二個參數需要的函數類型相符合。 因此,您可以簡單地傳遞一個大于號,Swift可以自動推斷出您想使用大于號的字符串函數實現:
let names = ["AT", "AE", "D", "S", "BE"]
var reversed = names.sorted(by: >)
print(reversed)
尾隨閉包
尾隨閉包是一個書寫在函數括號之后的閉包表達式,函數支持將其作為最后一個參數調用。
func someFunctionThatTakesAClosure(closure: () -> Void) {
// 函數體部分
}
// 以下是不使用尾隨閉包進行函數調用
someFunctionThatTakesAClosure({
// 閉包主體部分
})
// 以下是使用尾隨閉包進行函數調用
someFunctionThatTakesAClosure() {
// 閉包主體部分
}
let names = ["AT", "AE", "D", "S", "BE"]
//尾隨閉包---sorted() 后的 { $0 > $1} 為尾隨閉包。
var reversed = names.sorted() { $0 > $1 }
print(reversed)