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
都符合文章开头提到的逃逸闭包的形成条件。