Swift闭包作为函数或方法参数简写

首先,我们看看闭包作为函数的参数时简写是什么样子的:

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 }
```
至此,闭包作为函数或方法参数的简写就写完了。大家应该也能看懂和使用了。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容