闭包的含义
闭包是自包含的函数代码块,可以在代码中被传递和使用。Swift 中的闭包与 C 和 Objective-C 中的代码块(blocks)以及其他一些编程语言中的匿名函数比较相似。
闭包可以捕获和存储其所在上下文中任意常量和变量的引用。被称为包裹常量和变量。 Swift 会为你管理在捕获过程中涉及到的所有内存操作。
闭包的主要优化
- 利用上下文推断参数和返回值类型
- 隐式返回单表达式闭包,即单表达式闭包可以省略
return
关键字 - 参数名称缩写
- 尾随闭包语法
闭包的应用场景
闭包和block的应用场景是一样的.(当你觉得这种情况在oc中用block能实现的,那么在swift中用闭包也能实现)
1,异步执行完成回调.
2,控制器间回调
3,自定义视图回调
闭包的三种模式
闭包有三种形式,1,没有参数没有返回值的闭包(最简单的闭包)
这里有一点需要注意的,一定要去执行调用闭包,否则里边代码不会执行
2,带参数没有返回值的闭包
3,带参数带返回值的闭包
这里要注意的是,返回值需要进行操作,不然会报警告.
注意!
用 in 去区分去分割函数的定义和实现,说通俗点就是分割 传参和后续操作的分割!!!
闭包回调
闭包回调,也就是说将闭包以参数的形式进行回调.
这里需要注意的是,swift中的GCD和oc中的GCD不同.
尾随闭包
尾随闭包是调比较简洁的写法
这里需要注意的是,"大多数",一般的闭包系统会自动帮我们做到尾随闭包, 并不是所有,例如上边GCD嵌套中.
那么我们根据上边尾随闭包的含义来对它进行修改.把该回调的最后一个形参以及最外层的小括号删除即可.
逃逸闭包
当一个闭包作为参数传到一个函数中,但是这个闭包在函数返回之后才被执行,我们称该闭包从函数中逃逸。当你定义接受闭包作为参数的函数时,你可以在参数名之前标注 @escaping
,用来指明这个闭包是允许“逃逸”出这个函数的。
一种能使闭包“逃逸”出函数的方法是,将这个闭包保存在一个函数外部定义的变量中。举个例子,很多启动异步操作的函数接受一个闭包参数作为 completion handler。这类函数会在异步操作开始之后立刻返回,但是闭包直到异步操作结束后才会被调用。在这种情况下,闭包需要“逃逸”出函数,因为闭包需要在函数返回之后被调用。例如:
var completionHandlers: [() -> Void] = []
func someFunctionWithEscapingClosure(completionHandler: @escaping () -> Void) {
completionHandlers.append(completionHandler)
}
新手分享,不喜勿喷!!!求分享,求扩散.求转发.