开发中swift闭包逃逸的学习

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

我的哔哩哔哩上的视频观看

点击传送吧space.bilibili.com/1237846717

你可能感兴趣的:(开发中swift闭包逃逸的学习)