Swift Language
blocchi
Ricerca…
introduzione
Da Swift Documentarion
Si dice che una chiusura sfugge ad una funzione quando la chiusura viene passata come argomento alla funzione, ma viene richiamata dopo il ritorno della funzione. Quando dichiari una funzione che accetta una chiusura come uno dei suoi parametri, puoi scrivere @escaping prima del tipo del parametro per indicare che la chiusura può uscire.
Chiusura senza fuga
In Swift 1 e 2, i parametri di chiusura erano in fuga per impostazione predefinita. Se sapessi che la tua chiusura non sfugge al corpo della funzione, puoi contrassegnare il parametro con l'attributo @noescape.
In Swift 3, è il contrario: i parametri di chiusura non sfuggono di default. Se si desidera che la funzione sfugga, è necessario contrassegnarla con l'attributo @escaping.
class ClassOne {
// @noescape is applied here as default
func methodOne(completion: () -> Void) {
//
}
}
class ClassTwo {
let obj = ClassOne()
var greeting = "Hello, World!"
func methodTwo() {
obj.methodOne() {
// self.greeting is required
print(greeting)
}
}
}
Chiusura di fuga
Da Swift Documentarion
@escaping
Applicare questo attributo al tipo di un parametro in una dichiarazione di metodo o funzione per indicare che il valore del parametro può essere memorizzato per l'esecuzione successiva. Ciò significa che il valore può superare la durata della chiamata. I parametri del tipo di funzione con l'attributo del tipo di escape richiedono l'uso esplicito di self. per proprietà o metodi.
class ClassThree {
var closure: (() -> ())?
func doSomething(completion: @escaping () -> ()) {
closure = finishBlock
}
}
Nell'esempio precedente il blocco di completamento viene salvato in chiusura e vivrà letteralmente oltre la chiamata di funzione. Quindi il compilatore costringerà a contrassegnare il blocco di completamento come @escaping.