iOS开发中Swift逃逸闭包知识
逃逸闭包必须满足下面2个条件:
1、闭包作为一个参数传到函数中
2、闭包在函数返回之后才执行
需要在参数前面加入标注:@escaping,用来指明这个闭包是允许“逃逸”出这个函数的。
注意:将一个闭包标记为@escaping意味着你必须在闭包中显式地引用
importUIKit
/**逃逸闭包满足下面2个条件:
*1、handle闭包作为一个参数传到函数payRequest中
*2、并且handle闭包在函数返回之后才执行
*需要在参数前面加入标注:@escaping,用来指明这个闭包是允许“逃逸”出这个函数的
*注意:将一个闭包标记为@escaping意味着你必须在闭包中显式地引用self
*/
funcpayRequest(handle:@escaping(Data?,URLResponse?,Error?)->Void){
leturlStr=URL(string:"http://www.baidu.com")
letsession=URLSession(configuration:.default)
session.dataTask(with:urlStr!,completionHandler:handle)
}
funcsomeFunctionWithNonescapingClosure(closure:()->Void){
closure()
}
classSomeClass{
varx=10
funcdoSomething(){
payRequest{(data,resp,error)in
x=100//此处编译错误,必须显式地引用self
}
someFunctionWithNonescapingClosure{x=200}
}
}
在Swift标准库中,有很多这种类型的闭包,比如下面的异步请求的方法:
openfuncdataTask(withrequest:URLRequest,completionHandler:@escaping(Data?,URLResponse?,Error?)->Swift.Void)->URLSessionDataTask
openfuncdataTask(withurl:URL,completionHandler:@escaping(Data?,URLResponse?,Error?)->Swift.Void)->URLSessionDataTask
都符合文章开头提到的逃逸闭包的形成条件。
热门推荐
10 香港老妈结婚祝福语简短
11 毕业立体贺卡祝福语简短
12 简短新年年会祝福语
13 评论小品祝福语大全简短
14 恭喜师兄结婚祝福语简短
15 员工集体辞职祝福语简短
16 高中新生祝福语 简短
17 装修祝福语男生搞笑简短
18 生日开业蛋糕祝福语简短