Pourquoi est-il important de spécifier explicitement l'annotation @escaping dans les fonctions utilisant des closures asynchrones ?
sobes.tech IA
Réponse de l'IA
En Swift, l’annotation @escaping indique qu’une fermeture (closure) peut être appelée après que la fonction qui la reçoit ait terminé son exécution. Cela est important pour les opérations asynchrones, où la fermeture est stockée et appelée plus tard, par exemple après la fin d’une requête réseau.
Sans @escaping, le compilateur suppose que la fermeture est appelée de manière synchrone à l’intérieur de la fonction, et ne permet pas de la stocker pour l’appeler plus tard, afin d’éviter d’éventuels problèmes de gestion de la mémoire et du cycle de vie.
Exemple :
func fetchData(completion: @escaping () -> Void) {
DispatchQueue.global().async {
// Travail asynchrone
completion() // appel de la fermeture plus tard
}
}
Ici, completion est marqué comme @escaping car il est appelé après la sortie de la fonction fetchData, dans un autre thread.
Si @escaping n’est pas spécifié dans ces cas, le compilateur générera une erreur, car la fermeture peut être appelée plus tard, et sans cette annotation, Swift ne garantit pas une gestion correcte de la mémoire et du cycle de vie de la fermeture.