闭包
闭包是可以在你的代码中被传递和引用的功能性独立代码块.
闭包又被称为待执行的代码块.
有返回值,有形参,使用in关键字,还有@escaping关键字.
样式:
1 | {(形参1,形参2,形参3) ->返回值 in |
例子:
1 | let b1 = {(s1:String) ->Void in |
闭包的使用
尾随闭包
作为函数参数,在当前函数进行返回,这时闭包的形参会被作为返回值,书写形参时只要书写对应的类型即可;
1 | //书写类 |
如果闭包cl是在函数返回之后调用的,我们就说这个闭包逃逸了,比如异步函数,那么需要补充@escaping关键字修饰,表示这闭包是允许逃逸的;
函数在启动任务之后返回,但是闭包要直到任务完成 – 闭包需要逃逸,以便稍后调用.
1 | class Message: NSObject { |
结合typealias使用
结合typealias来使用的好处是,你不必在函数后面就返回该闭包,而是可以在类的任何地方返回.
第一步:定义闭包别名
1 | typealias mineClosure = (URL,Dictionary<String, Any>) ->Void |
第二步:定义闭包变量属性
1 | var c1:mineClosure? |
第三步:定义触发闭包回调方法
1 | func getTheMessage(temp:@escaping mineClosure) { |
第四步:返回闭包
1 | func begin(){ |
最后,调用
1 | class ClosureView: BaseViewController { |
防止闭包循环引用
在闭包里面的对象会被闭包强引用,所以使用的时候要注意是否会引起循环引用.
下面是防止循环引用的解决方案;
1 | //方案1,使用weak |
The end