2016-03-27 24 views
6

Swift programlama dili el kitabını okuyorum ve kaçan bir kapatmadan bahsediyor. Kaçan kapamalarla ilgili olarak, "kapama, işlevin bir argümanı olarak geçilir, ancak işlev geri döndükten sonra çağrılır" ile ne demek istediklerini bilmiyorum. Birisi kaçan kapanmalara örnek verebilir mi?Swift'de kaçış kapanmasının güzel bir örneği nedir?

cevap

2

bir kaçış kapağın bir örneği bazı asenkron görevi, bu tür bir ağ istedikten olarak tamamlama işleyici olacaktır:

func performRequest(parameters: [String: String], completionHandler: (NSData?, NSError?) ->()) { 
    let request = NSMutableURLRequest(URL: url) 
    request.HTTPMethod = "POST" 
    request.HTTPBody = try! NSJSONSerialization.dataWithJSONObject(parameters, options: []) 
    request.setValue("application/json", forHTTPHeaderField: "Content-Type") 

    let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { data, response, error in 
     completionHandler(data, error) 
    } 
    task.resume() 
} 

Ve bu yüzden böyle denir: Bu completionHandler

performRequest(["foo" : "bar"]) { data, error in 
    guard error == nil else { 
     print(error) 
     return 
    } 

    // now use data here 
} 

// Note: The `completionHandler` above runs asynchronously, so we 
// get here before the closure is called, so don't try to do anything 
// here with `data` or `error`. Any processing of those two variables 
// must be put _inside_ the closure above. 

Kapanış, NSURLSession yöntem dataTaskWithRequest zaman uyumsuz olarak çalıştığı için kaçma olarak kabul edilir (yani hemen döner ve istek bittiğinde daha sonra kendi kapanması çağrılır).

2

Swift 3'te kapatma parametreleri varsayılan olarak kaçmıyor.

İşlev döndükten sonra kapanışın çağrıldığını göstermek için parametre türünden önce kapanış özniteliğini yazmamız gerekiyor. Biz @escaping özelliğini kaldırırsanız

typealias Operation = (Data?) ->() 

func addToQueue(data: Data?, operation: @escaping Operation) { 
    OperationQueue.main.addOperation { 
     operation(data) 
    } 
} 

, Xcode

non-escaping parameter error message

+0

Oldukça net cevap aşağıda hata mesajı gösterecektir, benim konuydu nerede anlamaya yardımcı oldu. 3-4 seviyeli kapanışlarım vardı, bu yüzden '@ escaping'in tam olarak nereye yerleştirileceğini anlamak zordu. – Jonauz