查看: 1426|回复: 0

[IOS开发教程] iOS开发中Swift逃逸闭包知识

发表于 2018-4-13 08:00:05

逃逸闭包必须满足下面2个条件:

1、闭包作为一个参数传到函数中

2、闭包在函数返回之后才执行

需要在参数前面加入标注: @escaping,用来指明这个闭包是允许“逃逸”出这个函数的。

注意:将一个闭包标记为 @escaping 意味着你必须在闭包中显式地引用

  1. import UIKit
  2. /** 逃逸闭包满足下面2个条件:
  3. * 1、handle闭包作为一个参数传到函数payRequest中
  4. * 2、并且handle闭包在函数返回之后才执行
  5. * 需要在参数前面加入标注: @escaping,用来指明这个闭包是允许“逃逸”出这个函数的
  6. * 注意:将一个闭包标记为 @escaping 意味着你必须在闭包中显式地引用 self
  7. */
  8. func payRequest(handle:@escaping (Data?, URLResponse? ,Error?) -> Void) {
  9. let urlStr = URL(string: "http://www.baidu.com")
  10. let session = URLSession(configuration: .default)
  11. session.dataTask(with: urlStr!, completionHandler: handle)
  12. }
  13. func someFunctionWithNonescapingClosure(closure: () -> Void) {
  14. closure()
  15. }
  16. class SomeClass {
  17. var x = 10
  18. func doSomething() {
  19. payRequest { (data, resp, error) in
  20. x = 100 // 此处编译错误,必须显式地引用 self
  21. }
  22. someFunctionWithNonescapingClosure { x = 200 }
  23. }
  24. }
复制代码

在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

都符合文章开头提到的逃逸闭包的形成条件。



回复

使用道具 举报