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