首先,我們看看閉包作為函數(shù)的參數(shù)時簡寫是什么樣子的:
let arr = [1,2,3]
//下方代碼的作用是,遍歷數(shù)組,打印出每一個元素
arr.map { print($0) }
//下方代碼的作用是,從大到小排序數(shù)組內元素,生成一個新的數(shù)組new
let new = arr.sorted { $0 > $1 }
可能第一次接觸swift的朋友會一臉懵逼,這都是什么意思?不急,往下看完。
1.什么是閉包
閉包:就是自包含的代碼塊,可以在代碼中被傳遞和使用。
閉包,實際上就是OC里面的blocks,在其它語言里面就是匿名函數(shù)。
閉包在swift中有幾種形式,我們的主題是閉包的簡寫,關于閉包更多的概念,就不詳細講解了。
2.完整函數(shù)的寫法
我們用數(shù)組的sorted(by:)排序方法來舉例。該方法會返回一個與原數(shù)組大小相同,內部元素不同的數(shù)組,對原數(shù)組,該方法不會修改。sorted(by:)方法接收一個函數(shù)參數(shù),函數(shù)的類型為:(Int, Int) -> Bool。
let arr = [1,2,3,8,6,5,4]
//定義出排序函數(shù)
func sortedMethod(_ s1: Int, _ s2: Int) -> Bool {
return s1 > s2
}
//排序
let new = arr.sorted(by: sortedMethod) //new的內容:8 6 5 4 3 2 1
3.使用閉包的寫法
sorted(by:)方法,可以接收一個閉包用來代替函數(shù)作為參數(shù)
//使用閉包。in關鍵字,表示閉包的參數(shù)和返回值類型定義已經(jīng)完成,閉包函數(shù)體即將開始
let new1 = arr.sorted(by: { (s1: Int, s2: Int) -> Bool in
return s1 > s2
}) //new的內容:8 6 5 4 3 2 1
4.根據(jù)上下文推斷類型
因為閉包是作為sorted(by:)方法的參數(shù)傳入的,所以閉包的參數(shù)和返回類型可以被推斷出來。所以閉包的參數(shù)和返回值聲明可以被省略。如下:
//省略參數(shù)和返回值聲明
let new2 = arr.sorted(by: { s1, s2 in
return s1 > s2
})
雖然說這樣寫很方便,但是會不利于閱讀,完整的寫完格式,能夠提高代碼的可讀性。
5.單表達式閉包隱式返回
單行表達式的閉包可以省略return關鍵字。
注意:必須是單行表達式的閉包才能省略return關鍵字
//單行表達式省略return關鍵字
let new3 = arr.sorted(by: { s1, s2 in
s1 > s2
})
```
##6.參數(shù)名稱縮寫
使用閉包來作為參數(shù),swift提供了參數(shù)名稱縮寫功能。就是說,可以使用$0,$1,$2來依次使用參數(shù),即使該參數(shù)沒有被顯式的定義。因此,可以省略掉in關鍵字和前方的參數(shù)。
```swift
//參數(shù)名稱縮寫,$0和$1分別代表s1和s2
let new4 = arr.sorted(by: { $0 > $1 })
```
##7.運算符方法
實際上,由于 > 該符號實際上是一個函數(shù),類型為(Int, Int) -> Bool,所以,可以更加簡單的寫。
```swift
//運算符方法
let new5 = arr.sorted(by: > )
```
##8.尾隨閉包
如果需要一個很長的閉包表達式作為最后一個參數(shù)傳遞給函數(shù),可以使用尾隨閉包來增強可讀性。
***注意點:1.作為最后一個參數(shù)傳遞給函數(shù)。2.使用尾隨閉包可以不用寫出其它參數(shù)標簽***
```swift
//尾隨閉包
let new6 = arr.sorted() { $0 > $1 }
//如果閉包表達式是函數(shù)或者方法的唯一參數(shù),可以省略()
let new7 = arr.sorted { $0 > $1 }
```
至此,閉包作為函數(shù)或方法參數(shù)的簡寫就寫完了。大家應該也能看懂和使用了。