一、閉包的完整格式
{(parameters) -> return type in // 閉包的類型描述
statements // 閉包體
}
二、 閉包簡寫的幾個依據(jù)
1.閉包可更具上下文推斷參數(shù)和返回值的類型
- 如果閉包沒有參數(shù),那么in和之前的描述可以省略瘤袖。
2.從單行表達(dá)式閉包中隱式返回(也就是閉包體只有一行代碼,可以省略return)
3.可以簡化閉包的參數(shù)名昂验,如$0,$1(從0開始捂敌,表示第i個參數(shù)...)
- 結(jié)合第一點艾扮,就是即使閉包有參數(shù),使用簡化參數(shù)名占婉,那么in和之前的描述可以省略泡嘴。
4.提供尾隨閉包語法(Trailing closure syntax)
- 4.1如果傳入的參數(shù),最后一個參數(shù)是閉包锐涯,那么可以把閉包放在()外面
- 4.2如果傳入的參數(shù)只有一個磕诊,且是一個閉包,那么這個()可以省略
三纹腌、結(jié)合具體案例分析
- 1.sort函數(shù)(排序函數(shù))
let names = ["g","b","a", "c", "d", "f"]
// 傳入閉包(完整寫法)
names.sort({ (num1, num2) -> Bool in
return num1 > num2
})
// 簡寫1 (依據(jù)上面第4點)
// 4.1
names.sort(){ (num1, num2) -> Bool in
return num1 > num2
}
// 4.2
names.sort{ (num1, num2) -> Bool in
return num1 > num2
}
// 簡寫1(依據(jù)上面第2.4點)
names.sort{ (num1, num2) -> Bool in
num1 > num2
}
// 簡寫2(依據(jù)上面第1.3.4點)
names.sort{ return $0 > $1 }
// 簡寫3(依據(jù)上面的1.2.3.4點)
names.sort{ $0 > $1 }
// 簡寫4(這不屬于閉包的簡寫,是sort函數(shù)的簡寫)
names.sort(>)
names.sort(<)
names.sort() // 排序函數(shù)(默認(rèn)從小到大)
2.reduce函數(shù) (歸整函數(shù))
var numbers = [1, 2, 3]
// numbers.reduce(initial: T, combine: (T, Int) throws -> T)
// 傳入了兩個參數(shù)滞磺,最后一個參數(shù)是一個閉包
// 完整的寫法
let result = numbers.reduce( 10 , { (sum, elemt) -> Int in
return sum + elemt
})
// 簡寫1(依據(jù)上面的第4點)
let result01 = numbers.reduce(10) { (sum, elemt) -> Int in
return sum + elemt
}
// 最終簡寫 (依據(jù)上面的1.2.3.4點)
let result02 = numbers.reduce(10) {$0 + $1}