首先,我們看看閉包作為函數(shù)的參數(shù)時(shí)簡寫是什么樣子的:
let arr = [1,2,3]
//下方代碼的作用是惩激,遍歷數(shù)組少办,打印出每一個(gè)元素
arr.map { print($0) }
//下方代碼的作用是呢堰,從大到小排序數(shù)組內(nèi)元素,生成一個(gè)新的數(shù)組new
let new = arr.sorted { $0 > $1 }
可能第一次接觸swift的朋友會(huì)一臉懵逼凡泣,這都是什么意思枉疼?不急,往下看完鞋拟。
1.什么是閉包
閉包:就是自包含的代碼塊骂维,可以在代碼中被傳遞和使用。
閉包贺纲,實(shí)際上就是OC里面的blocks航闺,在其它語言里面就是匿名函數(shù)。
閉包在swift中有幾種形式猴誊,我們的主題是閉包的簡寫潦刃,關(guān)于閉包更多的概念,就不詳細(xì)講解了懈叹。
2.完整函數(shù)的寫法
我們用數(shù)組的sorted(by:)排序方法來舉例乖杠。該方法會(huì)返回一個(gè)與原數(shù)組大小相同,內(nèi)部元素不同的數(shù)組澄成,對原數(shù)組胧洒,該方法不會(huì)修改畏吓。sorted(by:)方法接收一個(gè)函數(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的內(nèi)容:8 6 5 4 3 2 1
3.使用閉包的寫法
sorted(by:)方法菲饼,可以接收一個(gè)閉包用來代替函數(shù)作為參數(shù)
//使用閉包。in關(guān)鍵字,表示閉包的參數(shù)和返回值類型定義已經(jīng)完成,閉包函數(shù)體即將開始
let new1 = arr.sorted(by: { (s1: Int, s2: Int) -> Bool in
return s1 > s2
}) //new的內(nèi)容:8 6 5 4 3 2 1
4.根據(jù)上下文推斷類型
因?yàn)殚]包是作為sorted(by:)方法的參數(shù)傳入的,所以閉包的參數(shù)和返回類型可以被推斷出來。所以閉包的參數(shù)和返回值聲明可以被省略矩乐。如下:
//省略參數(shù)和返回值聲明
let new2 = arr.sorted(by: { s1, s2 in
return s1 > s2
})
雖然說這樣寫很方便,但是會(huì)不利于閱讀,完整的寫完格式,能夠提高代碼的可讀性。
5.單表達(dá)式閉包隱式返回
單行表達(dá)式的閉包可以省略return關(guān)鍵字臼氨。
注意:必須是單行表達(dá)式的閉包才能省略return關(guān)鍵字
//單行表達(dá)式省略return關(guān)鍵字
let new3 = arr.sorted(by: { s1, s2 in
s1 > s2
})
```
##6.參數(shù)名稱縮寫
使用閉包來作為參數(shù)掺喻,swift提供了參數(shù)名稱縮寫功能。就是說储矩,可以使用$0,$1,$2來依次使用參數(shù)感耙,即使該參數(shù)沒有被顯式的定義。因此持隧,可以省略掉in關(guān)鍵字和前方的參數(shù)即硼。
```swift
//參數(shù)名稱縮寫,$0和$1分別代表s1和s2
let new4 = arr.sorted(by: { $0 > $1 })
```
##7.運(yùn)算符方法
實(shí)際上,由于 > 該符號實(shí)際上是一個(gè)函數(shù)屡拨,類型為(Int, Int) -> Bool只酥,所以,可以更加簡單的寫呀狼。
```swift
//運(yùn)算符方法
let new5 = arr.sorted(by: > )
```
##8.尾隨閉包
如果需要一個(gè)很長的閉包表達(dá)式作為最后一個(gè)參數(shù)傳遞給函數(shù)裂允,可以使用尾隨閉包來增強(qiáng)可讀性。
***注意點(diǎn):1.作為最后一個(gè)參數(shù)傳遞給函數(shù)哥艇。2.使用尾隨閉包可以不用寫出其它參數(shù)標(biāo)簽***
```swift
//尾隨閉包
let new6 = arr.sorted() { $0 > $1 }
//如果閉包表達(dá)式是函數(shù)或者方法的唯一參數(shù)绝编,可以省略()
let new7 = arr.sorted { $0 > $1 }
```
至此,閉包作為函數(shù)或方法參數(shù)的簡寫就寫完了貌踏。大家應(yīng)該也能看懂和使用了十饥。