欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

iOS开发中Swift逃逸闭包知识

程序员文章站 2023-12-18 23:45:28
逃逸闭包必须满足下面2个条件: 1、闭包作为一个参数传到函数中 2、闭包在函数返回之后才执行 需要在参数前面加入标注: @escaping,用来指明...

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

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

上一篇:

下一篇: