Swift Language
Blocs
Recherche…
Introduction
De Swift Documentarion
Une fermeture est dite échapper à une fonction lorsque la fermeture est passée en argument à la fonction, mais est appelée après le retour de la fonction. Lorsque vous déclarez une fonction qui prend une fermeture comme l'un de ses paramètres, vous pouvez écrire @escaping avant le type du paramètre pour indiquer que la fermeture est autorisée à s'échapper.
Fermeture sans fuite
Dans Swift 1 et 2, les paramètres de fermeture s'échappaient par défaut. Si vous saviez que votre fermeture n'échapperait pas au corps de la fonction, vous pourriez marquer le paramètre avec l'attribut @noescape.
Dans Swift 3, c'est l'inverse: les paramètres de fermeture sont non-échappant par défaut. Si vous souhaitez que la fonction échappe à la fonction, vous devez la marquer avec l'attribut @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)
}
}
}
Fermeture de fermeture
De Swift Documentarion
@ esquiver
Appliquez cet attribut à un type de paramètre dans une déclaration de méthode ou de fonction pour indiquer que la valeur du paramètre peut être stockée pour une exécution ultérieure. Cela signifie que la valeur est autorisée à survivre à la durée de vie de l'appel. Les paramètres de type de fonction avec l'attribut de type d'échappement nécessitent une utilisation explicite de self. pour les propriétés ou les méthodes.
class ClassThree {
var closure: (() -> ())?
func doSomething(completion: @escaping () -> ()) {
closure = finishBlock
}
}
Dans l'exemple ci-dessus, le bloc d'achèvement est enregistré à la fermeture et passera littéralement au-delà de l'appel de fonction. Donc complier va forcer à marquer le bloc d'achèvement comme @escaping.