iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 11
0
自我挑戰組

【自我挑戰】一步一腳印,每天進步一點的Swift自學之路。系列 第 11

從零開始的學習之旅-Day11

閉包 Closure


閉包其實就是一種匿名的函式,在上一章介紹的函式就是一種有名子的函式,所以說匿名的函式就是指不需要給予函式名稱,而它的特性則是如果今天這個函式只需要執行一次的話,就不需要特別建立一個函式,可以用匿名函式「閉包」,執行一次即可。這個概念有點像之前提到,如果再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)

結果會得到https://ithelp.ithome.com.tw/upload/images/20190926/20120063GAUmVDPSkg.png

閉包函式的寫法

let reversed = letterAtoD.sorted(by: { (a1: String, a2: String) -> Bool in return a1 < a2 })
print(reversed)

一樣得到相同的結果https://ithelp.ithome.com.tw/upload/images/20190926/20120063lsbgRwQ8bm.png

同樣的結果但過程卻簡潔很多,而且閉包還可以寫的更簡便。

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: < )

是否有感受到閉包的便利性? 最後再來看一次原本函式的程式碼,單行表達式閉包可以節省到什麼程度吧。
https://ithelp.ithome.com.tw/upload/images/20190926/2012006331DuGNBkkd.png


上一篇
從零開始的學習之旅-Day10
系列文
【自我挑戰】一步一腳印,每天進步一點的Swift自學之路。11
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言