Ich habe in Swift über Optionals gelesen und Beispiele gesehen, in denen if let
überprüft wird, ob ein Optional einen Wert enthält, und falls dies der Fall ist, etwas mit dem nicht umschlossenen Wert zu tun.
Ich habe jedoch gesehen, dass in Swift 2.0 das Schlüsselwort guard let
meistens verwendet wird. Ich frage mich, ob if let
es aus Swift 2.0 entfernt wurde oder ob es noch verwendet werden kann.
Soll ich meine Programme ändern, enthalten if let
zu guard let
?
quelle
if let
wenn dernon-nil
Fall gültig ist. Verwenden Sie diese Option,guard
wenn dernil
Fall einen Fehler darstellt.guard
angemessen ist, auch wenn kein Fehler vorliegt. Manchmal bedeutet es nur, dass nichts zu tun ist. Zum BeispielpositionTitle
könnte eine Methodeguard if let title = title else {return}
. Der Titel kann optional sein. In diesem Fall ist dies kein Fehler. Istguard let
aber trotzdem angebracht.if let
ist nur innerhalb desif let
Gültigkeitsbereichs sichtbar . Die durch gebundene Variableguard let
ist danach sichtbar. Daher ist es sinnvoll, Guard zu verwenden, um auch optionale Werte zu binden.Wache kann Klarheit verbessern
Wenn Sie Guard verwenden, haben Sie eine viel höhere Erwartung, dass der Guard erfolgreich ist, und es ist etwas wichtig, dass Sie den Bereich nur vorzeitig verlassen möchten, wenn er nicht erfolgreich ist . Wie Sie schützen, um zu sehen, ob eine Datei / ein Bild vorhanden ist, ob ein Array leer ist oder nicht.
Wenn Sie den obigen Code mit if-let schreiben, wird dem lesenden Entwickler mitgeteilt, dass es sich eher um eine 50-50 handelt. Aber wenn Sie Guard verwenden, fügen Sie Ihrem Code Klarheit hinzu , und dies impliziert, dass ich davon ausgehe, dass dies in 95% der Fälle funktioniert. Sollte dies jemals fehlschlagen, weiß ich nicht, warum dies der Fall ist. Es ist sehr unwahrscheinlich ... aber verwenden Sie stattdessen einfach dieses Standardbild oder bestätigen Sie mit einer aussagekräftigen Nachricht, was schief gelaufen ist!
Aufgrund der obigen Vorschläge und des sauberen Codes ist es auch wahrscheinlicher, dass Sie Behauptungen zu fehlgeschlagenen Guard-Anweisungen hinzufügen möchten / müssen. Dies verbessert lediglich die Lesbarkeit und macht anderen Entwicklern klar, was Sie erwartet haben.
(Sie werden keine Asserts / Voraussetzungen für
if-let
s verwenden. Es scheint einfach nicht richtig zu sein)Die Verwendung von Wachen hilft Ihnen auch dabei, die Klarheit zu verbessern, indem Sie die Pyramide des Untergangs vermeiden . Siehe Nitins Antwort .
Guard erstellt eine neue Variable
Es gibt einen wichtigen Unterschied, den meines Erachtens niemand gut erklärt hat.
Beides
guard let
undif let
entpacken Sie die Variable jedochMit
guard let
Sie schaffen eine neue Variable, wird existieren außerhalb derelse
Aussage.Mit
if let
Ihnen nicht zu schaffen sind , jeden neuer variabler nach der else - Anweisung, nur geben Sie den Code - Block , wenn die optionalen nicht-Null ist. Die neu erstellte Variable existiert nur innerhalb des Codeblocks, nicht danach!guard let:
if-let:
Weitere Informationen finden
if let
Sie unter: Warum die erneute Deklaration der optionalen Bindung keinen Fehler verursachtGuard erfordert das Verlassen des Oszilloskops
(Auch in Rob Napiers Antwort erwähnt):
Sie müssen innerhalb einer Funktion
guard
definiert haben . Der Hauptzweck besteht darin, den Bereich abzubrechen / zurückzugeben / zu beenden, wenn eine Bedingung nicht erfüllt ist:Denn
if let
Sie müssen es nicht in irgendeiner Funktion haben:guard
vs.if
Es ist erwähnenswert, dass es angemessener ist, diese Frage als
guard let
vsif let
undguard
vs zu betrachtenif
.Ein Standalone
if
führt kein Auspacken durch, ein Standalone auch nichtguard
. Siehe Beispiel unten. Es wird nicht vorzeitig beendet, wenn ein Wert istnil
. Es gibt KEINE optionalen Werte. Es wird nur vorzeitig beendet, wenn eine Bedingung nicht erfüllt ist.quelle
Wann
if-let
und wann zu verwendenguard
ist oft eine Frage des Stils.Angenommen, Sie haben
func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
ein optionales Array von Elementen (var optionalArray: [SomeType]?
), und Sie müssen entweder zurückgeben,0
wenn das Arraynil
(nicht festgelegt) ist odercount
wenn das Array einen Wert hat (festgelegt ist).Sie können es folgendermaßen implementieren
if-let
:oder so mit
guard
:Die Beispiele sind funktional identisch.
Wo
guard
wirklich glänzt, ist, wenn Sie eine Aufgabe wie das Überprüfen von Daten haben und möchten, dass die Funktion frühzeitig fehlschlägt, wenn etwas nicht stimmt.Anstatt eine Reihe von
if-let
s zu verschachteln, wenn Sie sich dem Abschluss der Validierung nähern, befinden sich der "Erfolgspfad" und die jetzt erfolgreich gebundenen Optionen im Hauptbereich der Methode, da alle Fehlerpfade bereits zurückgegeben wurden.quelle
Ich werde versuchen, die Nützlichkeit von Guard-Anweisungen mit einem (nicht optimierten) Code zu erklären.
Sie haben eine Benutzeroberfläche, in der Sie Textfelder für die Benutzerregistrierung mit Vorname, Nachname, E-Mail, Telefon und Passwort validieren.
Wenn ein textField keinen gültigen Text enthält, sollte dieses Feld firstResponder sein.
Hier ist der nicht optimierte Code:
Sie können oben sehen, dass auf alle Zeichenfolgen (firstNameString, lastNameString usw.) nur im Rahmen der if-Anweisung zugegriffen werden kann. Daher wird diese "Pyramide des Untergangs" erstellt und es gibt viele Probleme, einschließlich der Lesbarkeit und der Leichtigkeit, Dinge zu verschieben (wenn die Reihenfolge der Felder geändert wird, müssen Sie den größten Teil dieses Codes neu schreiben).
Mit der Guard-Anweisung (im folgenden Code) können Sie sehen, dass diese Zeichenfolgen außerhalb von verfügbar sind
{}
und verwendet werden, wenn alle Felder gültig sind.Wenn sich die Reihenfolge der Felder ändert, verschieben Sie einfach die entsprechenden Codezeilen nach oben oder unten, und schon kann es losgehen.
Dies ist eine sehr einfache Erklärung und ein Anwendungsfall. Hoffe das hilft!
quelle
Grundlegender Unterschied
Wache lassen
wenn lassen
HINWEIS: Beide werden zum Entpacken der optionalen Variablen verwendet.
quelle
Die klarste Erklärung, die ich gesehen habe, war im Github Swift Style Guide :
if
fügt eine Ebene der Tiefe hinzu:guard
nicht:quelle
bewachen
Eine Wachaussage hat folgende Form:
wenn lassen
quelle
Ich habe das von Swift mit Bob gelernt.
Typisches Else-If
Probleme mit Else-If
Guard-Anweisung Ein Guard-Block wird nur ausgeführt, wenn die Bedingung falsch ist, und verlässt die Funktion durch Rückgabe. Wenn die Bedingung erfüllt ist, ignoriert Swift den Schutzblock. Es bietet einen frühen Ausstieg und weniger Klammern. +
Packen Sie die Optionen mit Else-If aus
Eine Guard-Anweisung ist nicht nur nützlich, um einen typischen bedingten Block durch eine else-if-Anweisung zu ersetzen, sondern auch, um Optionen durch Minimieren der Anzahl der Klammern zu entpacken. Beginnen wir zum Vergleich damit, wie Sie mehrere Optionen mit else-if auspacken. Lassen Sie uns zunächst drei Optionen erstellen, die ausgepackt werden.
Der schlimmste Albtraum
Der obige Code funktioniert zwar, verstößt aber gegen das DRY-Prinzip. Es ist grausam. Lassen Sie es uns zusammenfassen. +
Etwas besser Der folgende Code ist besser lesbar als oben. +
Mit Guard auspacken Die else-if-Anweisungen können durch Guard ersetzt werden. +
Mehrere Optionen mit Else-If auspacken Bisher haben Sie die Optionen einzeln ausgepackt . Mit Swift können wir mehrere Optionen gleichzeitig auspacken. Wenn einer von ihnen nil enthält, wird der else-Block ausgeführt.
Mehrere Optionen mit Guard auspacken Natürlich sollten wir Guard over else-if verwenden. +
quelle