J'essaie de comprendre plus précisément la «fermeture» de Swift.
Mais @escaping
et Completion Handler
sont trop difficiles à comprendre
J'ai recherché de nombreux messages et documents officiels Swift, mais je pensais que ce n'était toujours pas suffisant.
Ceci est 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 a deux façons et raisons d'utiliser @escaping
Le premier est pour stocker une fermeture, le second est pour le fonctionnement Async.
Voici mes questions :
Premièrement, si doSomething
s'exécute, alors someFunctionWithEscapingClosure
s'exécutera avec le paramètre de fermeture et cette fermeture sera enregistrée dans un tableau de variables globales.
Je pense que la clôture est {self.x = 100}
Comment self
dans {self.x = 100} qui 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 variable locale completionHandler
dans le we using
mot-clé de la variable globale 'completionHandlers @ escaping`!
sans retour de @escaping
mot-clé someFunctionWithEscapingClosure
, la variable locale completionHandler
supprimera de la mémoire
@escaping
est de garder cette fermeture dans la mémoire
Est-ce correct?
Enfin, je m'interroge simplement sur l'existence de cette grammaire.
C'est peut-être une question très rudimentaire.
Si nous voulons qu'une fonction s'exécute après une fonction spécifique. Pourquoi n'appelons-nous pas simplement 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?
Voici une petite classe d'exemples que j'utilise pour me rappeler comment fonctionne @escaping.
la source
@escaping
qualifications.i.e. escape the scope of this function.