首先,我们看看闭包作为函数的参数时简写是什么样子的:
let arr = [1,2,3]
//下方代码的作用是,遍历数组,打印出每一个元素
arr.map { print($0) }
//下方代码的作用是,从大到小排序数组内元素,生成一个新的数组new
let new = arr.sorted { $0 > $1 }
可能第一次接触swift的朋友会一脸懵逼,这都是什么意思?不急,往下看完。
1.什么是闭包
闭包:就是自包含的代码块,可以在代码中被传递和使用。
闭包,实际上就是OC里面的blocks,在其它语言里面就是匿名函数。
闭包在swift中有几种形式,我们的主题是闭包的简写,关于闭包更多的概念,就不详细讲解了。
2.完整函数的写法
我们用数组的sorted(by:)排序方法来举例。该方法会返回一个与原数组大小相同,内部元素不同的数组,对原数组,该方法不会修改。sorted(by:)方法接收一个函数参数,函数的类型为:(Int, Int) -> Bool。
let arr = [1,2,3,8,6,5,4]
//定义出排序函数
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:)方法,可以接收一个闭包用来代替函数作为参数
//使用闭包。in关键字,表示闭包的参数和返回值类型定义已经完成,闭包函数体即将开始
let new1 = arr.sorted(by: { (s1: Int, s2: Int) -> Bool in
return s1 > s2
}) //new的内容:8 6 5 4 3 2 1
4.根据上下文推断类型
因为闭包是作为sorted(by:)方法的参数传入的,所以闭包的参数和返回类型可以被推断出来。所以闭包的参数和返回值声明可以被省略。如下:
//省略参数和返回值声明
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.参数名称缩写
使用闭包来作为参数,swift提供了参数名称缩写功能。就是说,可以使用$0,$1,$2来依次使用参数,即使该参数没有被显式的定义。因此,可以省略掉in关键字和前方的参数。
```swift
//参数名称缩写,$0和$1分别代表s1和s2
let new4 = arr.sorted(by: { $0 > $1 })
```
##7.运算符方法
实际上,由于 > 该符号实际上是一个函数,类型为(Int, Int) -> Bool,所以,可以更加简单的写。
```swift
//运算符方法
let new5 = arr.sorted(by: > )
```
##8.尾随闭包
如果需要一个很长的闭包表达式作为最后一个参数传递给函数,可以使用尾随闭包来增强可读性。
***注意点:1.作为最后一个参数传递给函数。2.使用尾随闭包可以不用写出其它参数标签***
```swift
//尾随闭包
let new6 = arr.sorted() { $0 > $1 }
//如果闭包表达式是函数或者方法的唯一参数,可以省略()
let new7 = arr.sorted { $0 > $1 }
```
至此,闭包作为函数或方法参数的简写就写完了。大家应该也能看懂和使用了。