(一)autoclosure:
autoclosure可以把一句话自动的封装成一个闭包。但是不支持带有输入参数的写法
func autoclosure(_ check: @autoclosure ()->Bool) { if check() { print("true") } }
此时调用的时候就可以直接写成:
autoclosure(2>3)
(二)@escaping:
在以前版本闭包的使用时不用加@escaping的。当前版本,如果闭包没有回调参数返回值,是不需要@escaping的。但是如果闭包传递了参数。就会出现一种假设。那就是参数中block的内容会在函数执行返回前就完成。也就是说对于block的调用时同步的。
简单的说 就是如果这个闭包是在这个函数结束前被调用,就是noescape。
闭包在函数执行完成后才调用,调用的地方超过了函数的范围,就是逃逸闭包。
网络请求后结束的回调就是逃逸的。因为发起请求后过一段时间闭包执行。
在swift3.0中所有闭包都是默认非逃逸的,无需@noescape。如果是逃逸的就@escaping表示。
延迟操作,网络加载等都需要@escaping。
func clorse(completion:@escaping (_ json: [String])->()) { let workingQueue = DispatchQueue(label: "workingQueue") workingQueue.async { // 延迟操作 print("努力工作") Thread.sleep(forTimeInterval: 2.0) let json = ["ac","mym"] DispatchQueue.main.async { print("结束工作") // 主线程更新 回调 completion(json) } } }