2016-05-29 5 views
2

In Swift, wenn ich innerhalb einer Schließung bin, die sich selbst innerhalb einer anderen Funktion befindet, gibt es eine Möglichkeit, die Funktion selbst zu verlassen?Kann schnell aus dem Wurzelverschluss austreten?

Hier ist ein Beispiel dafür, wie dies aussehen könnte, wenn Sie Verschlüsse aus der GCDKit-Bibliothek verwenden.

func test() { 
    GCDQueue.Default.async { 
     print("Print me!") 
     return //Is there a statement that does this? 
    }.notify(.Main) { 
     print("Never print me.") 
    } 
} 

Antwort

4

Nein, gibt es nicht. Closures werden in eigenständigen Umgebungen ausgeführt. Soweit Sie wissen, führt der Thread, bei dem test() aufgerufen wurde, die Methode test() nicht mehr aus.

1

Betrachten wir eine einfachere Version, die keine Bibliotheken von Drittanbietern, zusätzliche Warteschlangen oder andere Komplexität enthält. Wir erstellen einfach eine Schließung und führen sie sofort aus.

func dothing(andPrint shouldPrint: Bool) { 
    let closure = { 
     guard shouldPrint else { return } 
     print("I printed!") 
    } 

    closure() 
    print("did it return?") 
} 

dothing(andPrint: false) // Prints "did it return?" 

Die return hier tritt aus dem Verschluss, nicht dothing. Da closure an eine andere Funktion übergeben oder in einer Eigenschaft gespeichert und zu einem späteren Zeitpunkt ausgeführt werden kann (möglicherweise in einer anderen Warteschlange als in Ihrem Beispiel), gibt es für die return keine Möglichkeit, etwas über sich hinaus zu verlassen. Überlegen Sie, ob wir die Schaffung des Verschlusses in seine eigene Funktion Refactoring waren:

func fetchClosure(andPrint shouldPrint: Bool) ->() -> Void { 
    return { 
     guard shouldPrint else { return } 
     print("I printed!") 
    } 
} 

func dothing(andPrint shouldPrint: Bool) { 
    let closure = fetchClosure(andPrint: shouldPrint) 

    closure() 
    print("did it return?") 
} 

dothing(andPrint: false) // Prints "did it return?" 

Es sollte nicht überraschen, das das gleiche Verhalten hat (sonst wäre dies kein einfaches refactor sein). Jetzt stell dir vor, wie es funktionieren würde (oder auch könnte), wenn sich return anders verhielt.

Ihr Beispiel ist nur eine viel kompliziertere Version der gleichen Sache. return verlässt den Verschluss.

Verwandte Themen