虚位以待(AD)
虚位以待(AD)
首页 > 软件编程 > IOS编程/Objective-C > iOS开发中Swift逃逸闭包知识

iOS开发中Swift逃逸闭包知识
类别:IOS编程/Objective-C   作者:码皇   来源:互联网   点击:

这篇文章主要介绍了iOS开发中Swift逃逸闭包的相关知识点以及需要注意的地方,需要的朋友收藏下吧。

逃逸闭包必须满足下面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 逃逸闭包