我正在参加「启航计划」
Swift中的闭包Closure.
1 Swift中的闭包结构是什么样的?
{
(参数列表) -> 返回值类型 in 函数体代码
}
2 什么是尾随闭包?
- 将一个很长的闭包表达式作为函数的最终一个实参.
- 使用尾随闭包可以增强函数的可读性.
- 尾随闭包是一个被书写在函数调用括号外面(后边)的闭包表达式.
// fn便是一个尾随闭包参数
func exec(v1: Int, v2: Int, fn: (Int, Int) -> Int) {
print(fn(v1, v2))
}
// 调用
exec(v1: 10, v2: 20) {
$0 + $1
}
3 什么是逃逸闭包?
- 当闭包作为一个实践参数传递给一个函数或者变量的时候, 我们就说这个闭包逃逸了, 可以在形式参数前写
@escaping
来清晰闭包是答应逃逸的. - 非逃逸闭包、逃逸闭包, 一般都是作为参数传递给函数.
- 非逃逸闭包: 闭包调用发生在函数完毕前, 闭包调用在函数效果域内.
- 逃逸闭包: 闭包有可能在函数完毕后调用, 闭包调用逃逸出了函数的效果域, 需要经过
@escaping
声明.
// 定义一个数组用于存储闭包类型
var completionHandlers: [() -> Void] = []
// 在方法中将闭包作为实践参数, 存储到外部变量中
func someFunctionWithEscapingClosure(completionHandler: @escaping () -> Void) {
completionHandlers.append(completionHandler)
}
- 上面这种情况, 如果不标记函数的形式参数为
escaping
, 就会编译报错.
4 什么是主动闭包?
- 主动闭包是一种主动创建的用来把作为实践参数传递给函数的表达式打包的闭包.
- 它不承受任何实践参数, 并且当它被调用时, 它会返回内部打包的表达式的值.
- 这个语法的优点在于经过写普通表达式替代显式闭包而使你省掉围住函数形式参数的括号.
func getFirstPositive(_ v1: Int, _ v2: @autoclosure () -> Int) -> Int? {
return v1 > 0 ? v1 : v2()
}
getFirstPositive(10, 20)
- 为了避免与期望冲突, 使用了
@autoclosure
的地方最好清晰注释清楚: 这个值会被推延履行. -
@autoclosure
会主动将20封装成闭包{ 20 }
-
@autoclosure
只支持()->T
格局的参数 -
@autoclosure
并非只支持最终一个参数 - 有
@autoclosure
、无@autoclosure
, 构成了函数重载.
发文不易, 喜欢点赞的人更有好运气 :), 定时更新+重视不迷路~
ps:欢迎加入笔者18年树立的研究iOS审阅及前沿技术的三千人扣群:662339934,坑位有限,补白“网友”可被群管经过~