Ich verwende Xcode 6 Beta 4. Ich habe diese seltsame Situation, in der ich nicht herausfinden kann, wie ich angemessen auf Optionen testen kann.
Wenn ich ein optionales xyz habe, ist dies der richtige Weg zum Testen:
if (xyz) // Do something
oder
if (xyz != nil) // Do something
In den Dokumenten wird angegeben, dass dies auf die erste Art und Weise geschehen soll, aber ich habe festgestellt, dass manchmal die zweite Methode erforderlich ist und keinen Compilerfehler generiert. In anderen Fällen generiert die zweite Methode einen Compilerfehler.
Mein spezielles Beispiel ist die Verwendung des GData-XML-Parsers, der schnell überbrückt wird:
let xml = GDataXMLDocument(
XMLString: responseBody,
options: 0,
error: &xmlError);
if (xmlError != nil)
Hier, wenn ich es nur getan hätte:
if xmlError
es würde immer wahr zurückgeben. Wenn ich es jedoch tue:
if (xmlError != nil)
dann funktioniert es (wie es in Objective-C funktioniert).
Gibt es etwas mit GData XML und der Art und Weise, wie Optionen behandelt werden, die mir fehlen?
Antworten:
In Xcode Beta 5 können Sie Folgendes nicht mehr tun:
Dies erzeugt einen Fehler:
Sie müssen eines dieser Formulare verwenden:
quelle
So fügen Sie den anderen Antworten hinzu, anstatt einer Variablen mit einem anderen Namen innerhalb einer
if
Bedingung zuzuweisen:Sie können denselben Variablennamen wie folgt wiederverwenden:
Auf diese Weise können Sie vermeiden, dass die Namen der kreativen Variablen ausgehen ...
Dies nutzt die in Swift unterstützte variable Schattierung .
quelle
Eine der direktesten Möglichkeiten, Optionen zu verwenden, ist die folgende:
Angenommen, es
xyz
handelt sich um einen optionalen Typ, wieInt?
zum Beispiel.Auf diese Weise können Sie beide testen, ob
xyz
ein Wert enthalten ist, und in diesem Fall sofort mit diesem Wert arbeiten.In Bezug auf Ihren Compilerfehler ist der Typ
UInt8
nicht optional (Anmerkung Nr. '?') Und kann daher nicht in konvertiert werdennil
. Stellen Sie sicher, dass die Variable, mit der Sie arbeiten, optional ist, bevor Sie sie wie eine behandeln.quelle
Swift 3.0, 4.0
Es gibt hauptsächlich zwei Möglichkeiten, optional auf Null zu prüfen. Hier sind Beispiele mit Vergleich zwischen ihnen
1. wenn lassen
if let
ist die einfachste Möglichkeit, optional auf Null zu prüfen. An diese Nullprüfung, die durch Komma getrennt ist, können andere Bedingungen angehängt werden. Die Variable darf nicht Null sein, um sich für die nächste Bedingung zu bewegen. Wenn nur keine Prüfung erforderlich ist, entfernen Sie zusätzliche Bedingungen im folgenden Code.Wenn dies
x
nicht Null ist, wird der if-Abschluss ausgeführt undx_val
ist im Inneren verfügbar. Andernfalls wird der else-Abschluss ausgelöst.2. Wache lassen
guard let
kann ähnliche Dinge tun. Ihr Hauptzweck ist es, es logisch vernünftiger zu machen. Es ist wie zu sagen, stellen Sie sicher, dass die Variable nicht Null ist, sonst stoppen Sie die Funktion .guard let
kann auch zusätzliche Zustandsprüfung als durchführenif let
.Die Unterschiede bestehen darin, dass der nicht verpackte Wert im selben Bereich verfügbar
guard let
ist wie im Kommentar unten gezeigt. Dies führt auch zu dem Punkt , dass in anderem Verschluss, das Programm den aktuellen Bereich zu verlassen, durchreturn
,break
usw.quelle
Von schnellen Programmierung Führung
Der beste Weg, dies zu tun, ist
und wenn Sie die
xyz
in if-Anweisung verwenden. Dann können Sie diexyz
if-Anweisung in einer konstanten Variablen auspacken. Sie müssen also nicht jede Stelle in der if-Anweisung auspacken, an der siexyz
verwendet wird.Diese Konvention wird
apple
von Entwicklern vorgeschlagen und wird von Entwicklern befolgt.quelle
if xyz != nil {...}
.Obwohl Sie eine Option entweder explizit mit einer optionalen
nil
Bindung vergleichen oder eine optionale Bindung verwenden müssen, um ihren Wert zusätzlich zu extrahieren (dh Optionen werden nicht implizit in boolesche Werte konvertiert), ist es erwähnenswert, dass Swift 2 dieguard
Anweisung hinzugefügt hat , um die Pyramide des Untergangs beim Arbeiten zu vermeiden mit mehreren optionalen Werten.Mit anderen Worten, Ihre Optionen umfassen jetzt die explizite Überprüfung auf
nil
:Optionale Bindung:
Und
guard
Aussagen:Beachten Sie, wie eine normale optionale Bindung zu mehr Einrückungen führen kann, wenn mehr als ein optionaler Wert vorhanden ist:
Sie können diese Verschachtelung mit
guard
Anweisungen vermeiden :quelle
nil
Wert zu verwenden, aber ich stimme zu, dass die Lernkurve etwas steil ist. :)Swift 5-Protokollerweiterung
Hier ist ein Ansatz mit Protokollerweiterung, mit dem Sie eine optionale Nullprüfung problemlos einbinden können:
Verwendung
quelle
swift
Analogonpythonistas
derjenigen, die versuchen, die Sprache in irgendeiner Form von pythonischer Reinheit zu halten. Meine Einstellung? Ich habe gerade Ihren Code in mein Utils-Mixin gehoben.Jetzt können Sie schnell Folgendes tun, um ein wenig vom Ziel-c zurückzugewinnen
if nil else
quelle
Stattdessen kann der
if
ternäre Operator nützlich sein, wenn Sie einen Wert erhalten möchten, der darauf basiert, ob etwas Null ist:quelle
xyz == nil
Ausdruck funktioniert nicht, aberx != nil
funktioniert. Ich weiß nicht warum.Ein anderer Ansatz neben der Verwendung von
if
oderguard
Anweisungen zum Ausführen der optionalen Bindung besteht darin, Folgendes zu erweiternOptional
:ifValue
empfängt einen Abschluss und ruft ihn mit dem Wert als Argument auf, wenn das optionale nicht null ist. Es wird folgendermaßen verwendet:Sie sollten wahrscheinlich einen
if
oderguard
jedoch verwenden, da dies die konventionellsten (also bekannten) Ansätze sind, die von Swift-Programmierern verwendet werden.quelle
Eine Option, die nicht speziell behandelt wurde, ist die Verwendung der ignorierten Wertesyntax von Swift:
Ich mag das, da
nil
in einer modernen Sprache wie Swift nach Gefühlen gesucht wird, die fehl am Platz sind. Ich denke, der Grund, warum es sich fehl am Platz anfühlt, ist, dassnil
es sich im Grunde genommen um einen Sentinel-Wert handelt. Wir haben Sentinels so ziemlich überall in der modernen Programmierungnil
abgeschafft, also sollte es auch so sein.quelle
Auch können Sie verwenden
Nil-Coalescing Operator
Wenn dies der Fall
optionalValue
istnil
, wird automatisch ein Wert zugewiesendefaultValue
quelle
Dieser Test funktionierte in allen Fällen wie erwartet. Übrigens brauchen Sie die Klammern nicht
()
.quelle
if (xyz != nil)
.Wenn Sie eine Bedingung haben und auspacken und vergleichen möchten, können Sie die Kurzschlussbewertung des zusammengesetzten booleschen Ausdrucks wie in nutzen
Zugegeben, dies ist nicht so lesbar wie einige der anderen vorgeschlagenen Beiträge, aber es erledigt die Arbeit und ist etwas prägnant als die anderen vorgeschlagenen Lösungen.
quelle