Expliquez la différence clé entre les closures qui permettent de sortir de leur portée et ceux qui ne le peuvent pas.
sobes.tech IA
Réponse de l'IA
En iOS (Swift/Objective-C), les fermetures (closures) peuvent capturer des variables de la portée extérieure. La différence clé entre les fermetures qui peuvent sortir de leur portée et celles qui ne le peuvent pas, est liée à la durée de vie et à la capture du contexte :
-
Les fermetures qui peuvent sortir de leur portée sont des objets qui capturent des références aux variables du contexte extérieur et les conservent, permettant d'utiliser ces variables même après la fin de la portée d'origine. Ces fermetures sont généralement stockées dans des propriétés, transmises en tant que callbacks, etc.
-
Les fermetures qui ne peuvent pas sortir de leur portée sont celles qui ne sont pas stockées ou qui ne capturent pas le contexte, ou qui sont utilisées uniquement dans la même portée où elles sont définies. Elles ne peuvent pas être appelées ultérieurement, car le contexte a déjà été détruit.
Exemple :
func makeIncrementer(amount: Int) -> () -> Int {
var total = 0
let incrementer: () -> Int = {
total += amount
return total
}
return incrementer
}
let inc = makeIncrementer(amount: 5)
print(inc()) // 5
print(inc()) // 10
Ici, la fermeture incrementer capture les variables total et amount et les conserve, permettant de les utiliser en dehors de la fonction d'origine. Si la fermeture ne capturait pas le contexte ou n'était pas stockée, elle ne pourrait pas fonctionner après la sortie de la fonction.