func compare(l1: Int, l2: Int) -> Bool {
return l1 > l2
}
let numbers = [2, 3, 6, 8, 1]
let sortedNumbers = numbers.sorted(by: { (l1: Int, l2: Int) -> Bool in return l1 > l2})
print(sortedNumbers)
let sortedNumbers1 = numbers.sorted(by: { (l1, l2) in l1 > l2})
print(sortedNumbers1)
let sortedNumbers2 = numbers.sorted(by: { $0 > $1})
print(sortedNumbers2)
let sortedNumbers3 = numbers.sorted(by: >)
print(sortedNumbers3)
// 尾閉包函數(shù)
// 當函數(shù)中的參數(shù)中使用了閉包,而且閉包內(nèi)部很復雜,且閉包是最后一個參數(shù)時,才能使用尾閉包
let sortedNumbers4 = numbers.sorted() { // 同樣是上邊的例子,我們可以使用尾閉包,好處是增加代碼的閱讀性
$0 < $1
}
print(sortedNumbers4)
解釋說明
Swift 自動對行內(nèi)閉包提供簡寫實際參數(shù)名,你也可以通過 $0 , $1 , $2 等名字來引用閉包的實際參數(shù)值。
如果你在閉包表達式中使用這些簡寫實際參數(shù)名,那么你可以在閉包的實際參數(shù)列表中忽略對其的定義,并且簡寫實際參數(shù)名的數(shù)字和類型將會從期望的函數(shù)類型中推斷出來。 in 關鍵字也能被省略,因為閉包表達式完全由它的函數(shù)體組成:
let numbers = [3,2,4,1,5,7,6];
var sortedNumbers = numbers.sorted(by:{$0 < $1});
print(sortedNumbers);//輸出為:[1, 2, 3, 4, 5, 6, 7]
sortedNumbers = numbers.sorted(by:{$1 < $0});
print(sortedNumbers);//輸出為:[7, 6, 5, 4, 3, 2, 1]
可以看出,可以用$0、$1、$2來表示調(diào)用閉包中參數(shù),$0指代第一個參數(shù),$1指代第二個參數(shù),$2指代第三個參數(shù),以此類推$n+1指代第n個參數(shù),$后的數(shù)字代表參數(shù)的位置,一一對應。