文章

Swift闭包简写过程

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 }
本文由作者按照 CC BY 4.0 进行授权