2017-09-15 1 views
10

[Swift]Swift @escaping und Completion Handler

Hallo ich versuche, 'Closure' von Swift genauer zu verstehen.

Aber @escaping und Completion Handler sind zu schwer zu verstehen

ich viele Nachrichten und offizielle Dokumente von Swift gesucht, aber ich fühlte mich stil nicht genug

Dies ist das Codebeispiel von offiziellen Dokumenten

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 gibt zwei Möglichkeiten und Gründe mit @esacping

Erste s Schließung chungs, Zweiter ist Async Betrieb Zweck

Und von jetzt an sie meine Fragen sind

Erstens, wenn doSomething dann die Ausführung someFunctionWithEscapingClosure mit Verschluss Parametern ausführen und dass Schließung wird in der globalen Variablen-Array gespeichert werden.

Ich denke, dass Verschluss {self.x = 100}

Wie self in {self.x = 100}, die in globalen Variablen gespeichert completionHandlers zu instance das Objekt von SomeClass herstellen kann?

Zweitens verstehe ich someFunctionWithEscapingClosure wie folgt.

Um lokale Variable Schließung completionHandler zu globalen Variable 'CompletionHandlers` speichern wir verwenden @ escaping Schlüsselwort!

ohne Schlüsselwort @escaping someFunctionWithEscapingClosure kehrt, completionHandler lokale Variable aus dem Speicher entfernen wird

@escaping wird in den Speicher, der Verschluss halten

Ist das richtig?

Zuletzt frage ich mich nur über die Existenz dieser Grammatik.

Vielleicht ist dies eine sehr rudimentäre Frage

, wenn wir eine Funktion nach einiger spezifische Funktion ausführt wollen

warum nennen wir nicht nur eine Funktion nach bestimmten Funktionsaufruf

, was das sind Unterschiede zwischen der Verwendung von oben Muster und Verwendung der escape Callback-Funktion

Vielen Dank für das Lesen lange Fragen und Entschuldigung für ich bin nicht native

Antwort

14

Zunächst einmal möchte ich „sehr gute Frage :)“ sagen

Fertigstellung Handler:

Angenommen, der Benutzer eine App aktualisiert, während Sie es.Sie möchten den Benutzer definitiv darüber informieren, wenn es fertig ist. Sie möchten möglicherweise eine Box mit der Aufschrift "Herzlichen Glückwunsch, jetzt können Sie genießen!"

So, wie führen Sie einen Block von Code nur, nachdem der Download abgeschlossen wurde? Wie animiert man bestimmte Objekte erst, nachdem ein View-Controller zum nächsten verschoben wurde? Nun, wir werden herausfinden, wie man einen Chef gestaltet. Aufgrund meiner expansiven Vokabelliste steht Abschluss Handler für

Do stuff when things have been done

Weitere Einzelheiten, kindly this blog post besuchen.

Dieser Link gibt mir völlige Klarheit über Completion-Handler (vom Entwickler Sicht definiert es genau, was wir verstehen müssen).

@escaping Verschlüsse:

Wenn Sie den Verschluss in einer Funktion Argumenten sind vorbei, es nach der Körper der Funktion wird ausgeführt und gibt die Compiler zurück. Wenn die Funktion endet, existiert der Gültigkeitsbereich des übergebenen Abschlusses und existiert im Speicher, bis der Abschluss ausgeführt wird.

Es gibt mehrere Möglichkeiten, um die Schließung in haltige Funktion zu entkommen:

  • Lagerung: Wenn Sie benötigen die Schließung in der globalen Variablen, das Eigentum oder andere Speicher zu speichern, die in dem Speicher Vergangenheit die existieren Aufrufende Funktion wird ausgeführt und gibt den Compiler zurück.

  • Asynchrone Ausführung: Wenn Sie die Schließung asynchron auf der Versandwarteschlange ausführen, hält die Warteschlange die Schließung im Speicher für Sie, kann in Zukunft verwendet werden. In diesem Fall haben Sie keine Ahnung, wann der Abschluss ausgeführt wird.

Wenn Sie versuchen, die Schließung in diesen Szenarien der Swift-Compiler den Fehler zeigen zu verwenden:

error screenshot

Für mehr Klarheit zu diesem Thema Sie this post on Medium überprüfen können.

Ich hoffe, dass Sie ein gutes Verständnis von diesem Link bekommen werden.

Wenn Sie noch irgendwelche Fragen haben (aber lesen Sie diesen Link zuerst Zeile für Zeile zuerst; es ist sehr gut erklärt) dann zögern Sie nicht, Ihren Kommentar zu teilen.

Dank

+0

Ihre Links waren sehr hilfreich –

+0

Danke, genießen in Swift Codierung –

Verwandte Themen