Ich versuche, 'Closure' von Swift genauer zu verstehen.
Aber @escapingund Completion Handlersind 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 doSomethingausgeführt someFunctionWithEscapingClosurewird, 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 selfin {self.x = 100}, das in einer globalen Variablen gespeichert completionHandlersist, eine Verbindung zu instancediesem Objekt von hergestellt werden SomeClass?
Zweitens verstehe ich das someFunctionWithEscapingClosureso.
Speichern des Schließens lokaler Variablen unter completionHandlerdem we usingSchlüsselwort 'CompletionHandlers @ Escaping ' der globalen Variablen !
Ohne @escapingSchlüsselwortrückgabe someFunctionWithEscapingClosurewird die lokale Variable completionHandleraus 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?
