Swift闭包其实相当于OC的匿名函数,当做函数入参的简写过程,在WWDC官方Swift课程里面有讲解的。
这里做一个记录,进行知识总结。OC的block使用下笔记可以看这篇文章
介绍
我们常使用的高阶函数就是使用闭包函数当入参之后简写出来的,例如
swift高阶函数可以看这篇文章
1
2
3
4
5
| let sortArr: [Int] = [1, 2, 3]
// 下方代码的作用是,遍历数组,打印出每一个元素
arr.map { print($0) }
// 下方代码的作用是,从大到小排序数组内元素,生成一个新的数组new
let new = arr.sorted { $0 > $1 }
|
1. 完整写法
1
2
3
4
5
6
7
| 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
|
2. 使用闭包的写法
1
2
3
4
| //使用闭包。in关键字,表示闭包的参数和返回值类型定义已经完成,闭包函数体即将开始
let new1 = arr.sorted(by: { (s1: Int, s2: Int) -> Bool in
return s1 > s2
}) //new的内容:8 6 5 4 3 2 1
|
3. 根据上下文推断类型
1
2
3
4
| //省略参数和返回值声明
let new2 = arr.sorted(by: { s1, s2 in
return s1 > s2
})
|
4. 单表达式闭包隐式返回
1
2
3
4
| //单行表达式省略return关键字
let new3 = arr.sorted(by: { s1, s2 in
s1 > s2
})
|
5. 参数名称缩写
1
2
| //参数名称缩写,$0和$1分别代表s1和s2
let new4 = arr.sorted(by: { $0 > $1 })
|
6. 运算符方法
实际上,由于 > 该符号实际上是一个函数,类型为(Int, Int) -> Bool,所以,可以更加简单的写。
1
2
| //运算符方法
let new5 = arr.sorted(by: > )
|
7. 尾随闭包
如果需要一个很长的闭包表达式作为最后一个参数传递给函数,可以使用尾随闭包来增强可读性。 注意点:1.作为最后一个参数传递给函数。2.使用尾随闭包可以不用写出其它参数标签
1
2
3
4
| //尾随闭包
let new6 = arr.sorted() { $0 > $1 }
//如果闭包表达式是函数或者方法的唯一参数,可以省略()
let new7 = arr.sorted { $0 > $1 }
|
总结
1
2
3
4
5
6
7
| 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
|
变成了下面
1
2
3
4
5
| let sortArr: [Int] = [1, 2, 3]
// 下方代码的作用是,遍历数组,打印出每一个元素
arr.map { print($0) }
// 下方代码的作用是,从大到小排序数组内元素,生成一个新的数组new
let new = arr.sorted { $0 > $1 }
|