Swift3.0-closure的@autoclosure和@escaping

(一)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)
            }
            
            
        }
   
        
    }
相关文章
相关标签/搜索