Swift閉包作為函數(shù)或方法參數(shù)簡寫

首先,我們看看閉包作為函數(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ù)的簡寫就寫完了。大家應該也能看懂和使用了。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容