Ich versuche, 'Closure' von Swift genauer zu verstehen.
Aber @escaping
und Completion Handler
sind zu schwer zu verstehen
Ich habe viele Swift-Postings und offizielle Dokumente durchsucht, aber ich hatte das Gefühl, dass es immer noch nicht genug war.
Dies ist das Codebeispiel für offizielle Dokumente
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)
Ich habe gehört, dass es zwei Möglichkeiten und Gründe gibt @escaping
Erstens dient das Speichern eines Verschlusses, zweitens dem Async-Betrieb.
Folgendes sind meine Fragen :
Wenn doSomething
ausgeführt someFunctionWithEscapingClosure
wird, wird zuerst mit dem Abschlussparameter ausgeführt, und dieser Abschluss wird in einem globalen Variablenarray gespeichert.
Ich denke, dass der Abschluss {self.x = 100} ist
Wie kann self
in {self.x = 100}, das in einer globalen Variablen gespeichert completionHandlers
ist, eine Verbindung zu instance
diesem Objekt von hergestellt werden SomeClass
?
Zweitens verstehe ich das someFunctionWithEscapingClosure
so.
Speichern des Schließens lokaler Variablen unter completionHandler
dem we using
Schlüsselwort 'CompletionHandlers @ Escaping ' der globalen Variablen !
Ohne @escaping
Schlüsselwortrückgabe someFunctionWithEscapingClosure
wird die lokale Variable completionHandler
aus dem Speicher entfernt
@escaping
ist, diesen Verschluss im Gedächtnis zu behalten
Ist das richtig?
Zuletzt wundere ich mich nur über die Existenz dieser Grammatik.
Vielleicht ist dies eine sehr rudimentäre Frage.
Wenn eine Funktion nach einer bestimmten Funktion ausgeführt werden soll. Warum rufen wir nicht einfach nach einem bestimmten Funktionsaufruf eine Funktion auf?
Was sind die Unterschiede zwischen der Verwendung des obigen Musters und der Verwendung einer Escape-Rückruffunktion?