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)
            }
            
            
        }
   
        
    }
相關文章
相關標籤/搜索