J'essaie de comprendre plus précisément la "fermeture" de Swift.
Pero @escaping
y Completion Handler
sont trop difficiles à comprendre
J'ai cherché dans de nombreux affichages Swift et documents officiels, mais j'ai estimé que ce n'était toujours pas suffisant.
Voici l'exemple de code des documents officiels
var completionHandlers: [()->Void] = []
func someFunctionWithEscapingClosure(completionHandler: @escaping ()->Void){
completionHandlers.append(completionHandler)
}
func someFunctionWithNoneescapingClosure(closure: ()->Void){
closure()
}
class SomeClass{
var x:Int = 10
func doSomething(){
someFunctionWithEscapingClosure {
self.x = 100
//not excute yet
}
someFunctionWithNoneescapingClosure {
x = 200
}
}
}
let instance = SomeClass()
instance.doSomething()
print(instance.x)
completionHandlers.first?()
print(instance.x)
J'ai entendu dire qu'il y avait deux façons et raisons d'utiliser @escaping
La première sert à stocker une fermeture, la seconde à des fins de fonctionnement asynchrone.
Voici mes questions :
Premièrement, si doSomething
s'exécute alors someFunctionWithEscapingClosure
sera exécuté avec le paramètre de fermeture et cette fermeture sera sauvegardée dans le tableau des variables globales.
Je pense que la fermeture est {self.x = 100}
Comment self
dans {self.x = 100} qui a été enregistré dans la variable globale completionHandlers
peut se connecter à instance
cet objet de SomeClass
?
Deuxièmement, je comprends someFunctionWithEscapingClosure
comme ça.
Pour stocker la fermeture de la variable locale completionHandler
à la variable globale "completionHandlers we using
Mot-clé @escaping` !
sans @escaping
mot-clé someFunctionWithEscapingClosure
retours, variable locale completionHandler
supprimera de la mémoire
@escaping
c'est de garder cette fermeture dans la mémoire
C'est bien ça ?
Enfin, je m'interroge sur l'existence de cette grammaire.
C'est peut-être une question très rudimentaire.
Si nous voulons qu'une fonction soit exécutée après une autre fonction spécifique. Pourquoi ne pas simplement appeler une fonction après un appel de fonction spécifique ?
Quelles sont les différences entre l'utilisation du modèle ci-dessus et l'utilisation d'une fonction de rappel d'échappement ?