iT邦幫忙

2022 iThome 鐵人賽

DAY 17
0

今天要來進入到我也很害怕的閉包,因為我有時候也看不太懂在說什麼,但藉由這個機會,在寫了一些東西後的我,可不可以明白一點他的概念。

閉包

閉包是自包含的函數代碼塊,可以在代碼中被傳遞和使用。
有時候想傳東西不一定要用 protocol 傳,也可以使用閉包傳,就看自己如何設計。

閉包可以捕獲和存儲其所在上下文中任意常量和變量的引用。被稱為包裹常量和變量。

在 函數 章節我們有介紹到全局跟嵌套函數都是特殊的閉包。
閉包使用以下三種形式:

  • 全局函數是一個有名字但不會捕獲任何值的閉包
  • 嵌套函數是一個有名字並可以捕獲其封閉函數域內值的閉包
  • 閉包表達式是一個利用輕量級語法所寫的可以捕獲其上下文中變量或常量值的匿名閉包

Swift 的閉包表達式擁有簡潔的風格,並鼓勵在常見場景中進行語法優化,主要優化如下:

  • 利用上下文推斷參數和返回值類型
  • 隱式返回單表達式閉包,即單表達式閉包可以省略 return 關鍵字
  • 參數名稱縮寫
  • 尾隨閉包語法

排序方法

func backward(_ s1: String, _ s2: String) -> Bool {
    return s1 > s2
}
var reversedNames = names.sorted(by: backward)
// reversedNames 为 ["Ewa", "Daniella", "Chris", "Barry", "Alex"]

這邊是一個簡單的排序方法, sorted(by:) 裡面可以帶一個閉包。

閉包表達式

{ (parameters) -> return type in
    statements
}

依照上面排序方法的例子可以寫成一個閉包的方式。

reversedNames = names.sorted(by: { (s1: String, s2: String) -> Bool in
    return s1 > s2
})

因為他的東西不多可以直接縮成一排

reversedNames = names.sorted(by: { (s1: String, s2: String) -> Bool in return s1 > s2 } )

根據上下文推斷型

繼續接續著排序方法的例子,因 sorted(by:) 本身後面就是要 (String, String) -> Bool 所以參數裡面的可以省略也可以正常運行。

reversedNames = names.sorted(by: { s1, s2 in return s1 > s2 } )

單行表達式閉包的隱式返回

簡單來說就是可以把 return 省略

reversedNames = names.sorted(by: { s1, s2 in s1 > s2 } )

參數名稱縮寫

可以使用 $0 $1 $2 來調用閉包裡面的參數。
所以上面的例子可以寫成

reversedNames = names.sorted(by: { $0 > $1 } )

運算符方法

剛好 sorted(by:) 可以簡單地用運算符來實現函數裡面的方法。

reversedNames = names.sorted(by: > )

今天就先到這裡,我們明天再來繼續。


上一篇
30天的 iOS 修仙道路 (16)
下一篇
30天的 iOS 修仙道路 (18)
系列文
30天的 iOS 修仙道路 站穩腳步基礎篇30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言