Swift 2 führte das guard
Schlüsselwort ein, mit dem sichergestellt werden kann, dass verschiedene Daten sofort einsatzbereit konfiguriert sind. Ein Beispiel, das ich auf dieser Website gesehen habe, zeigt eine submitTapped-Funktion:
func submitTapped() {
guard username.text.characters.count > 0 else {
return
}
print("All good")
}
Ich frage mich, ob die Verwendung guard
anders ist als die altmodische Verwendung einer if
Bedingung. Gibt es Vorteile, die Sie mit einem einfachen Scheck nicht erreichen könnten?
swift2
guard-statement
David Snabel
quelle
quelle
Antworten:
Beim Lesen dieses Artikels habe ich große Vorteile bei der Verwendung von Guard festgestellt
Hier können Sie die Verwendung von Guard mit einem Beispiel vergleichen:
Dies ist der Teil ohne Wache:
Hier setzen Sie Ihren gewünschten Code unter allen Bedingungen
Möglicherweise sehen Sie nicht sofort ein Problem damit, aber Sie können sich vorstellen, wie verwirrend es werden könnte, wenn es mit zahlreichen Bedingungen verschachtelt ist, die alle erfüllt sein müssen, bevor Sie Ihre Anweisungen ausführen
Die Möglichkeit, dies zu bereinigen, besteht darin, zuerst jede Ihrer Überprüfungen durchzuführen und zu beenden, wenn keine erfüllt sind. Dies ermöglicht ein einfaches Verständnis der Bedingungen, unter denen diese Funktion beendet wird.
Aber jetzt können wir Guard verwenden und sehen, dass es möglich ist, einige Probleme zu lösen:
Das gleiche Muster gilt auch für nicht optionale Werte:
Wenn Sie noch Fragen haben, können Sie den gesamten Artikel lesen: Swift Guard Statement.
Einpacken
Und schließlich stellte ich beim Lesen und Testen fest, dass, wenn Sie Guard verwenden, um alle Optionen auszupacken,
.
Hier wäre der entpackte Wert nur innerhalb des if-Blocks verfügbar
quelle
let x = x where x > 0
Bedeutet das, dass Sie eine andere Bedingung in Ihre optionale Bindung eingekoppelt haben ? Ich meine, es ist ein bisschen anders alsif let constantName = someOptional { statements }
Im Gegensatz zu
if
,guard
schafft die Variable, die von außerhalb des Blocks zugegriffen werden kann. Es ist nützlich, vieleOptional
s auszupacken .quelle
Es gibt wirklich zwei große Vorteile
guard
. Einer vermeidet die Pyramide des Untergangs, wie andere bereits erwähnt haben - viele nervigeif let
Aussagen, die ineinander verschachtelt sind, bewegen sich immer weiter nach rechts.Der andere Vorteil ist oft, dass die Logik, die Sie implementieren möchten, mehr "
if not let
" als "ist.if let { } else
" ist.Hier ein Beispiel: Angenommen, Sie möchten implementieren
accumulate
- eine Kreuzung zwischenmap
undreduce
wo es Ihnen ein Array von Laufreduzierungen zurückgibt . Hier ist es mitguard
:Wie würden Sie es ohne Schutz schreiben , aber wenn Sie es trotzdem verwenden
first
, wird eine Option zurückgegeben? Etwas wie das:Das zusätzliche Verschachteln ist ärgerlich, aber es ist auch nicht so logisch, das
if
und daselse
so weit voneinander entfernt zu haben. Es ist viel besser lesbar, den leeren Fall vorzeitig zu beenden und dann mit dem Rest der Funktion fortzufahren, als wäre dies keine Möglichkeit.quelle
Wenn eine Bedingung erfüllt ist, werden
guard
Variablen, die innerhalb desguard
Blocks deklariert sind, dem Rest des Codeblocks ausgesetzt und in seinen Geltungsbereich gebracht. Was, wie bereits erwähnt, bei verschachteltenif let
Anweisungen sicherlich nützlich sein wird .Beachten Sie, dass der Guard eine Rückgabe oder einen Wurf in seiner else-Anweisung erfordert .
JSON mit Guard analysieren
Im Folgenden finden Sie ein Beispiel dafür, wie ein JSON-Objekt mithilfe von guard und nicht if-let analysiert werden kann. Dies ist ein Auszug aus einem Blogeintrag, der eine Spielplatzdatei enthält, die Sie hier finden:
Verwendung von Guard in Swift 2 zum Parsen von JSON
Spielplatz herunterladen: Wachspielplatz
Mehr Info:
Hier ist ein Auszug aus dem The Swift Programming Language Guide:
quelle
Ein Vorteil ist die Beseitigung vieler verschachtelter
if let
Anweisungen. Sehen Sie sich das WWDC-Video "What's New in Swift" gegen 15:30 Uhr an, den Abschnitt mit dem Titel "Pyramid of Doom".quelle
Wann man Wachen benutzt
Wenn Sie einen Ansichts-Controller mit einigen UITextField-Elementen oder einer anderen Art von Benutzereingabe haben, werden Sie sofort feststellen, dass Sie die optionale Datei textField.text auspacken müssen, um zum darin enthaltenen Text zu gelangen (falls vorhanden!). isEmpty bringt Ihnen hier nichts, ohne Eingabe gibt das Textfeld einfach null zurück.
Sie haben also einige davon, die Sie auspacken und schließlich an eine Funktion übergeben, die sie an einen Serverendpunkt sendet. Wir möchten nicht, dass der Servercode mit Nullwerten umgehen oder versehentlich ungültige Werte an den Server senden muss, damit wir diese Eingabewerte zuerst mit Guard auspacken.
Sie werden feststellen, dass unsere Serverkommunikationsfunktion nicht optionale String-Werte als Parameter verwendet, daher wird der Guard zuvor ausgepackt. Das Auspacken ist etwas unintuitiv, da wir es gewohnt sind, mit if let auszupacken, wodurch Werte für die Verwendung innerhalb eines Blocks ausgepackt werden. Hier ist der Guard-Anweisung ein Block zugeordnet, aber es handelt sich tatsächlich um einen else-Block. Wenn Sie also das Entpacken fehlschlagen, werden die Werte direkt in den gleichen Kontext wie die Anweisung selbst entpackt.
// Trennung von Bedenken
Ohne Wache
Ohne Schutz würden wir einen großen Haufen Code erhalten, der a ähnelt Pyramide des Untergangs . Dies lässt sich nicht gut skalieren, um unserem Formular neue Felder hinzuzufügen oder um gut lesbaren Code zu erhalten. Einrückungen können schwierig zu befolgen sein, insbesondere bei so vielen anderen Aussagen an jeder Gabelung.
Ja, wir könnten all diese sogar kombinieren, wenn Anweisungen in eine einzige Anweisung durch Kommas getrennt werden, aber wir würden die Fähigkeit verlieren, herauszufinden, welche Anweisung fehlgeschlagen ist, und dem Benutzer eine Nachricht präsentieren.
https://thatthinginswift.com/guard-statement-swift/
quelle
Mit der Verwendung von Guard ist unsere Intensität klar. Wir möchten den Rest des Codes nicht ausführen, wenn diese bestimmte Bedingung nicht erfüllt ist. Auch hier können wir die Kette verlängern. Schauen Sie sich bitte den folgenden Code an:
quelle
Wachaussage wird reichen. es ist ein paar verschiedene
1) Es erlaubt mir, verschachtelte if-Anweisungen zu reduzieren.
2) Es erweitert meinen Gültigkeitsbereich, auf den meine Variable zugreifen kann
if-Anweisung
Wachaussage
quelle
Wacherklärung
Eine Guard-Anweisung wird verwendet, um die Programmsteuerung aus einem Bereich zu übertragen, wenn eine oder mehrere Bedingungen nicht erfüllt sind.
Synatx:
Vorteil:
1. Durch die Verwendung von
guard
Anweisungen können wir tief verschachtelte Bedingungen entfernen, deren einziger Zweck darin besteht, eine Reihe von Anforderungen zu validieren.2. Es wurde speziell für das frühzeitige Beenden einer Methode oder Funktion entwickelt.
Wenn Sie verwenden, wenn unten angegeben, ist der Code, wie er aussieht.
Mit Guard können Sie die Kontrolle aus einem Bereich übertragen, wenn eine oder mehrere Bedingungen nicht erfüllt sind.
Referenz:
1. Swift 2: Früh mit Exit beenden 2. Udacity 3. Guard Statement
quelle
if condition { return }
mürrisch?Wie eine if-Anweisung führt guard Anweisungen basierend auf einem Booleschen Wert eines Ausdrucks aus. Im Gegensatz zu einer if-Anweisung werden Guard-Anweisungen nur ausgeführt, wenn die Bedingungen nicht erfüllt sind. Sie können sich eine Wache eher wie eine Behauptung vorstellen, aber anstatt zu stürzen, können Sie sie elegant beenden.
Siehe: http://ericcerney.com/swift-guard-statement/
quelle
Es macht den Ablauf einer Sequenz mit mehreren Suchvorgängen und Optionen wirklich sehr viel präziser und klarer und reduziert viele Verschachtelungen. Siehe Erica Sadun Beitrag zum Ersetzen von Ifs . .... Könnte mitgerissen werden, ein Beispiel unten:
Sehen Sie, ob das klebt.
quelle
Einfach ausgedrückt bietet es eine Möglichkeit, Felder vor der Ausführung zu validieren. Dies ist ein guter Programmierstil, da er die Lesbarkeit verbessert. In anderen Sprachen könnte es so aussehen:
Da Swift Ihnen jedoch Optionen zur Verfügung stellt, können wir nicht prüfen, ob es Null ist, und seinen Wert einer Variablen zuweisen. Im Gegensatz dazu wird
if let
überprüft, ob es nicht Null ist, und eine Variable zugewiesen , die den tatsächlichen Wert enthält. Hierguard
kommt das Spiel ins Spiel. Es gibt Ihnen eine präzisere Möglichkeit, frühzeitig mit Optionen zu beenden.quelle
Quelle: Wache in Swift
Sehen wir uns das Beispiel an, um es klar zu verstehen
Beispiel 1:
Im obigen Beispiel sehen wir, dass 3 größer als 2 ist und die Anweisung in der Guard-else-Klausel übersprungen und True gedruckt wird.
Beispiel 2:
Im obigen Beispiel sehen wir, dass 1 kleiner als 2 ist und die Anweisung in der Guard-else-Klausel ausgeführt wird und False gedruckt wird, gefolgt von return.
Im obigen Beispiel verwenden wir guard let, um die Optionen auszupacken. In der Funktion getName haben wir eine Variable vom Typ string myName definiert, die optional ist. Wir verwenden dann guard let, um zu überprüfen, ob die Variable myName null ist oder nicht. Wenn Sie nicht name zuweisen und erneut prüfen, ist name nicht leer. Wenn beide Bedingungen qualifiziert sind, dh wahr, wird der else-Block übersprungen und "Bedingungen sind mit Namen erfüllt" gedruckt.
Grundsätzlich prüfen wir hier zwei durch Komma getrennte Dinge, zuerst das Auspacken und das optionale, und prüfen, ob dies die Bedingung erfüllt oder nicht.
Hier übergeben wir nichts an die Funktion, dh eine leere Zeichenfolge, und daher ist die Bedingung false der Druck.
Hier übergeben wir "Hallo" an die Funktion und Sie können sehen, dass die Ausgabe "Bedingung ist erfüllt Hallo" gedruckt wird.
quelle