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.