閉包其實就是一種匿名的函式,在上一章介紹的函式就是一種有名子的函式,所以說匿名的函式就是指不需要給予函式名稱,而它的特性則是如果今天這個函式只需要執行一次的話,就不需要特別建立一個函式,可以用匿名函式「閉包」,執行一次即可。這個概念有點像之前提到,如果再For-in或if裡面這個常數不會被指派給其他參數,那這個值可以用底線_代替,因為之後這個常數根本不會在被用到,所以不需給這個常數一個名稱。
那麼接下來我們來看看實例的部分,一般函式跟閉包在執行同一段程式碼的便利性吧。
首先先建立一組A-D的字母,故意把順序混亂,待會在利用func排序。
var letterAtoD = ["C", "B", "D", "A"]
一般函式的寫法
func sequence(a1: String, _ a2: String) -> Bool
{
return a1 < a2
}
let reversed = letterAtoD.sorted(by: sequence)
print(reversed)
結果會得到
閉包函式的寫法
let reversed = letterAtoD.sorted(by: { (a1: String, a2: String) -> Bool in return a1 < a2 })
print(reversed)
一樣得到相同的結果
同樣的結果但過程卻簡潔很多,而且閉包還可以寫的更簡便。
let reversed = letterAtoD.sorted(by: { (a1: String, a2: String) -> Bool in return a1 < a2 })
//把參數與返回值的型別都省略以及包含參數的小括弧和箭頭。
let reversed = letterAtoD.sorted(by: { a1, a2 in return a1 < a2 })
單行的表達式閉包可以連return都可以省略。
let reversed = letterAtoD.sorted(by: { a1, a2 in a1 < a2 })
最後甚至連參數名稱都可以簡寫為$0代表第一個參數$1代表第二個參數(還記得說過電腦的世界都從0開始嗎?)
let reversed = letterAtoD.sorted(by:{ $0 < $1 })
以為這樣就結束了嗎?沒有!節省一哥不是叫假的,還可以更簡便!!!
let reversed = letterAtoD.sorted(by: < )
是否有感受到閉包的便利性? 最後再來看一次原本函式的程式碼,單行表達式閉包可以節省到什麼程度吧。