iOS开发中Swift逃逸闭包知识
2018-02-11 10:38
543 查看
逃逸闭包必须满足下面2个条件:
1、闭包作为一个参数传到函数中
2、闭包在函数返回之后才执行
需要在参数前面加入标注: @escaping,用来指明这个闭包是允许“逃逸”出这个函数的。
注意:将一个闭包标记为 @escaping 意味着你必须在闭包中显式地引用
import UIKit /** 逃逸闭包满足下面2个条件: * 1、handle闭包作为一个参数传到函数payRequest中 * 2、并且handle闭包在函数返回之后才执行 * 需要在参数前面加入标注: @escaping,用来指明这个闭包是允许“逃逸”出这个函数的 * 注意:将一个闭包标记为 @escaping 意味着你必须在闭包中显式地引用 self */ func payRequest(handle:@escaping (Data?, URLResponse? ,Error?) -> Void) { let urlStr = URL(string: "http://www.baidu.com") let session = URLSession(configuration: .default) session.dataTask(with: urlStr!, completionHandler: handle) } func someFunctionWithNonescapingClosure(closure: () -> Void) { closure() } class SomeClass { var x = 10 func doSomething() { payRequest { (data, resp, error) in x = 100 // 此处编译错误,必须显式地引用 self } someFunctionWithNonescapingClosure { x = 200 } } }
在Swift标准库中,有很多这种类型的闭包,比如下面的异步请求的方法:
open func dataTask(with request: URLRequest, completionHandler: @escaping (Data?, URLResponse?, Error?) -> Swift.Void) -> URLSessionDataTask
open func dataTask(with url: URL, completionHandler: @escaping (Data?, URLResponse?, Error?) -> Swift.Void) -> URLSessionDataTask
都符合文章开头提到的逃逸闭包的形成条件。
相关文章推荐
- iOS开发系列--Swift 3.0不得不知的小知识
- iOS开发之OC与swift开发混编教程,代理的相互调用,block的实现。OC调用Swift中的代理, OC调用Swift中的Block 闭包,swift 3.0
- IOS开发语言Swift入门连载---闭包
- IOS开发-Swift-基础知识学习笔记
- iOS开发之OC与swift开发混编教程,代理的相互调用,block的实现。OC调用Swift中的代理, OC调用Swift中的Block 闭包,swift 3.0
- [iOS]Swift-逃逸闭包
- iOS 开发 -- Swift (八) 闭包
- 16、swift开发iOS——闭包
- iOS开发知识要点
- iOS HmacSHA1加密 和 MD5 Base64加密 --iOS开发系列---项目中成长的知识五
- IOS开发基础知识--碎片25
- 是时候适配 Swift 3 了吗——专访 LINE iOS 开发工程师王巍
- iOS开发基础知识--碎片4
- iOS苹果开发账号申请相关知识链接
- iOS开发系列---Objective-C之基础知识
- IOS开发之——CocoaPods安装和使用 OC和swift通吃
- iOS开发小结 - 关于swift中#if DEBUG判断不执行的解决方案
- 【ios开发技术】Swift 语言深入--Swift设计模式 (1/2)
- iOS蓝牙开发(一)蓝牙相关基础知识
- swift 编写欢迎界面-- ios开发