(一)autoclosure:json
autoclosure能够把一句话自动的封装成一个闭包。可是不支持带有输入参数的写法swift
func autoclosure(_ check: @autoclosure ()->Bool) { if check() { print("true") } }
此时调用的时候就能够直接写成:api
autoclosure(2>3)
(二)@escaping:网络
在之前版本闭包的使用时不用加@escaping的。当前版本,若是闭包没有回调参数返回值,是不须要@escaping的。可是若是闭包传递了参数。就会出现一种假设。那就是参数中block的内容会在函数执行返回前就完成。也就是说对于block的调用时同步的。闭包
简单的说 就是若是这个闭包是在这个函数结束前被调用,就是noescape。async
闭包在函数执行完成后才调用,调用的地方超过了函数的范围,就是逃逸闭包。函数
网络请求后结束的回调就是逃逸的。由于发起请求后过一段时间闭包执行。spa
在swift3.0中全部闭包都是默认非逃逸的,无需@noescape。若是是逃逸的就@escaping表示。线程
延迟操做,网络加载等都须要@escaping。code
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) } } }