Swift @échapper et Gestionnaire d'Achèvement

[Swift]

Salut, je suis en train d'essayer de comprendre les "Fermeture" de Swift avec plus de précision.

Mais @escaping et Completion Handler sont trop difficiles à comprendre

J'ai cherché de nombreuses Swift publications et documents officiels, mais j'ai senti qu'il n'était pas encore suffisant.

C'est le code d'exemple de 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 les raisons à l'aide de @escaping

Première est pour le stockage d'une fermeture, la seconde est pour Async à des fins d'exploitation.

Voici mes questions:

Tout d'abord, si doSomething exécute ensuite someFunctionWithEscapingClosure sera exécuté avec fermeture paramètre et que cette fermeture sera enregistrée dans la variable globale tableau.

Je pense que la fermeture est {self.x = 100}

Comment self dans {self.x = 100} sauvegardée dans la variable globale de completionHandlers peut se connecter à instance que l'objet de la SomeClass ?

Deuxième, je la compréhension someFunctionWithEscapingClosure comme ça.

Pour stocker les variables locales fermeture completionHandler à la variable globale 'completionHandlerswe using@échapper à ce mot-clé!

sans @escaping mot-clé someFunctionWithEscapingClosure retourne, la variable locale completionHandler va supprimer de la mémoire

@escaping est de le garder à la fermeture dans la mémoire

Est ce droit?

Enfin, je me demande juste au sujet de l'existence de cette grammaire.

Peut-être que c'est un très rudimentaire question.

Si nous voulons que la fonction à exécuter après certaines fonctions spécifiques. Pourquoi ne pas simplement appeler une fonction après un appel de fonction?

Quelles sont les différences entre l'aide du schéma ci-dessus et à l'aide d'un échappement fonction de rappel?

je vous remercie pour la lecture des questions et désolé car je ne suis pas originaire

OriginalL'auteur Dongkun Lee | 2017-09-15