/ / Quale è un buon esempio di chiusura di una fuga in Swift? - rapido, in fuga, chiusure

Qual è un buon esempio di chiusura di una fuga in Swift? - rapido, in fuga, chiusure

Sto leggendo il manuale del linguaggio di programmazione Swifte menziona una chiusura di fuga. Per quanto riguarda le chiusure in fuga, non so cosa intendano per "la chiusura viene passata come argomento alla funzione, ma viene chiamata dopo il ritorno della funzione". Qualcuno potrebbe fornire un esempio sulle chiusure di fuga?

risposte:

2 per risposta № 1

Un esempio di chiusura di escape è il gestore di completamento in alcune attività asincrone, ad esempio l'avvio di una richiesta di rete:

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

E questo è chiamato così:

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.

Questo completionHandler la chiusura è considerata come fuga perché NSURLSession metodo dataTaskWithRequest viene eseguito in modo asincrono (ad esempio, restituisce immediatamente e la sua chiusura verrà richiamata in seguito al termine della richiesta).


2 per risposta № 2

In Swift 3 i parametri di chiusura diventano senza escape per impostazione predefinita.

Abbiamo bisogno di scrivere @escaping attributo di chiusura prima del tipo di parametri per indicare che la chiusura viene chiamata dopo il ritorno della funzione.

typealias Operation = (Data?) -> ()

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

Se rimuoviamo @escaping attributo, Xcode mostrerà il seguente messaggio di errore

messaggio di errore parametro non in uscita