Swift3.0-closure的@autoclosure和@escaping


(一)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)
            }
            
            
        }
   
        
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM