Aus Apples Dokumentation :
Sie können
if
undlet
zusammen verwenden, um mit möglicherweise fehlenden Werten zu arbeiten. Diese Werte werden als Option dargestellt. Ein optionaler Wert enthält entweder einen Wert oder enthält,nil
um anzuzeigen, dass der Wert fehlt. Schreiben Sie ein Fragezeichen (?
) nach dem Typ eines Werts, um den Wert als optional zu markieren.
Warum sollten Sie einen optionalen Wert verwenden?
Antworten:
Ein optionales Element in Swift ist ein Typ, der entweder einen Wert oder keinen Wert enthalten kann. Optionale Optionen werden durch Anhängen von a
?
an einen beliebigen Typ geschrieben:Optionals (zusammen mit Generics) sind eines der am schwierigsten zu verstehenden Swift-Konzepte. Aufgrund der Art und Weise, wie sie geschrieben und verwendet werden, ist es leicht, eine falsche Vorstellung davon zu bekommen, was sie sind. Vergleichen Sie die obige Option mit der Erstellung einer normalen Zeichenfolge:
Aus der Syntax geht hervor, dass ein optionaler String einem normalen String sehr ähnlich ist. Es ist nicht. Ein optionaler String ist kein String mit aktivierter "optionaler" Einstellung. Es ist keine spezielle Sorte von String. Ein String und ein optionaler String sind völlig unterschiedliche Typen.
Hier ist das Wichtigste zu wissen: Ein optionales ist eine Art Container. Ein optionaler String ist ein Container, der möglicherweise einen String enthält. Ein optionales Int ist ein Container, der ein Int enthalten kann. Stellen Sie sich ein optionales Paket als eine Art Paket vor. Bevor Sie es öffnen (oder in der Sprache der Optionen "auspacken"), wissen Sie nicht, ob es etwas oder nichts enthält.
Sie können sehen, wie Optionen in der Swift-Standardbibliothek implementiert sind, indem Sie "Optional" in eine Swift-Datei eingeben und ⌘ darauf klicken. Hier ist der wichtige Teil der Definition:
Optional ist nur
enum
einer von zwei Fällen:.none
oder.some
. Wenn ja.some
, gibt es einen zugeordneten Wert, der im obigen BeispielString
"Hallo" wäre. Ein optionales Element verwendet Generics, um dem zugeordneten Wert einen Typ zuzuweisen. Der Typ eines optionalen String ist nichtString
, es istOptional
, oder genauer gesagtOptional<String>
.Alles, was Swift mit Optionen macht, ist magisch, um das Lesen und Schreiben von Code flüssiger zu gestalten. Leider verdeckt dies die Art und Weise, wie es tatsächlich funktioniert. Ich werde später einige der Tricks durchgehen.
Hinweis: Ich werde viel über optionale Variablen sprechen, aber es ist auch in Ordnung, optionale Konstanten zu erstellen. Ich markiere alle Variablen mit ihrem Typ, um das Verständnis der erstellten Typtypen zu erleichtern, aber Sie müssen dies nicht in Ihrem eigenen Code tun.
So erstellen Sie Optionen
Um ein optionales Element zu erstellen, fügen Sie
?
nach dem Typ, den Sie umbrechen möchten, ein an. Jeder Typ kann optional sein, auch Ihre eigenen benutzerdefinierten Typen. Sie können kein Leerzeichen zwischen dem Typ und dem haben?
.Optionale Optionen verwenden
Sie können ein optionales Element vergleichen,
nil
um festzustellen, ob es einen Wert hat:Das ist etwas verwirrend. Dies impliziert, dass ein optionales Element entweder das eine oder das andere ist. Es ist entweder Null oder es ist "Bob". Dies ist nicht wahr, das Optionale verwandelt sich nicht in etwas anderes. Der Vergleich mit Null ist ein Trick, um den Code besser lesbar zu machen. Wenn eine Option gleich Null ist, bedeutet dies nur, dass die Aufzählung derzeit auf gesetzt ist
.none
.Nur Optionen können Null sein
Wenn Sie versuchen, eine nicht optionale Variable auf Null zu setzen, wird eine Fehlermeldung angezeigt.
Eine andere Sichtweise auf Optionen ist die Ergänzung zu normalen Swift-Variablen. Sie sind ein Gegenstück zu einer Variablen, deren Wert garantiert ist. Swift ist eine vorsichtige Sprache, die Mehrdeutigkeiten hasst. Die meisten Variablen werden als nicht optional definiert, aber manchmal ist dies nicht möglich. Stellen Sie sich beispielsweise einen View Controller vor, der ein Bild entweder aus einem Cache oder aus dem Netzwerk lädt. Möglicherweise ist dieses Bild zum Zeitpunkt der Erstellung des Ansichtscontrollers vorhanden oder nicht. Es gibt keine Möglichkeit, den Wert für die Bildvariable zu garantieren. In diesem Fall müssten Sie es optional machen. Es beginnt,
nil
wenn das Bild abgerufen wird und das optionale einen Wert erhält.Die Verwendung einer Option zeigt die Absicht des Programmierers. Im Vergleich zu Objective-C, bei dem jedes Objekt Null sein könnte, muss Swift klar sein, wann ein Wert fehlen kann und wann er garantiert existiert.
Um ein optionales zu verwenden, "packen" Sie es aus
Ein optionales
String
kann nicht anstelle eines tatsächlichen verwendet werdenString
. Um den umschlossenen Wert in einem optionalen Wert zu verwenden, müssen Sie ihn auspacken. Der einfachste Weg, ein optionales Element zu entpacken, besteht darin,!
nach dem optionalen Namen ein nachträgliches hinzuzufügen . Dies wird als "Force Unwrapping" bezeichnet. Es gibt den Wert innerhalb des optionalen (als ursprünglichen Typ) zurück, aber wenn das optionale istnil
, verursacht es einen Laufzeitabsturz. Vor dem Auspacken sollten Sie sicher sein, dass es einen Wert gibt.Überprüfen und Verwenden eines optionalen
Da Sie vor dem Auspacken und Verwenden eines optionalen Elements immer auf Null prüfen sollten, ist dies ein häufiges Muster:
In diesem Muster überprüfen Sie, ob ein Wert vorhanden ist. Wenn Sie sicher sind, dass dies der Fall ist, erzwingen Sie das Entpacken in eine temporäre Konstante. Da dies so häufig vorkommt, bietet Swift eine Verknüpfung mit "if let" an. Dies wird als "optionale Bindung" bezeichnet.
Dies erzeugt eine temporäre Konstante (oder eine Variable , wenn Sie ersetzen
let
mitvar
) , dessen Umfang ist nur innerhalb der , wenn die Klammern. Da die Verwendung eines Namens wie "unwrappedMealPreference" oder "realMealPreference" eine Belastung darstellt, können Sie mit Swift den ursprünglichen Variablennamen wiederverwenden und einen temporären Namen innerhalb des Klammerbereichs erstellenHier ist ein Code, der zeigt, dass eine andere Variable verwendet wird:
Die optionale Bindung überprüft, ob die Option gleich Null ist. Wenn dies nicht der Fall ist, wird das optionale Element in die angegebene Konstante entpackt und der Block ausgeführt. In Xcode 8.3 und höher (Swift 3.1) führt der Versuch, eine solche Option zu drucken, zu einer nutzlosen Warnung. Verwenden Sie die optionalen Optionen
debugDescription
, um es zum Schweigen zu bringen:Wofür sind Optionen?
Optionale haben zwei Anwendungsfälle:
Einige konkrete Beispiele:
middleName
oderspouse
in einerPerson
Klasseweak
Eigenschaften in Klassen. Das, worauf sie zeigen, kann jederzeit eingestelltnil
werdenBoolean
In Objective-C gibt es keine Optionen, aber es gibt ein gleichwertiges Konzept, das null zurückgibt. Methoden, die ein Objekt zurückgeben können, können stattdessen nil zurückgeben. Dies bedeutet "das Fehlen eines gültigen Objekts" und wird oft verwendet, um zu sagen, dass etwas schief gelaufen ist. Es funktioniert nur mit Objective-C-Objekten, nicht mit Grundelementen oder grundlegenden C-Typen (Aufzählungen, Strukturen). Objective-C hatte häufig spezielle Typen, um das Fehlen dieser Werte darzustellen (
NSNotFound
was wirklich bedeutetNSIntegerMax
,kCLLocationCoordinate2DInvalid
eine ungültige Koordinate darzustellen,-1
oder es werden auch einige negative Werte verwendet). Der Codierer muss diese speziellen Werte kennen, damit sie für jeden Fall dokumentiert und gelernt werden müssen. Wenn eine Methode nichtnil
als Parameter verwendet werden kann, muss dies dokumentiert werden. In Objective-Cnil
war ein Zeiger, genau wie alle Objekte als Zeiger definiert wurden, abernil
auf eine bestimmte (Null-) Adresse zeigten. In Swiftnil
ist ein Literal, was das Fehlen eines bestimmten Typs bedeutet.Verglichen mit
nil
Früher konnten Sie alle optionalen Optionen verwenden als
Boolean
:In neueren Versionen von Swift müssen Sie verwenden
leatherTrim != nil
. Warum ist das? Das Problem ist, dass aBoolean
in ein optionales eingewickelt werden kann. Wenn Ihnen dasBoolean
gefällt:Es gibt zwei Arten von "falsch", eine, bei der es keinen Wert gibt, und eine, bei der es einen Wert hat, aber der Wert ist
false
. Swift hasst Mehrdeutigkeiten, daher müssen Sie jetzt immer eine Option gegen prüfennil
.Sie fragen sich vielleicht, wozu ein optionales Element gut
Boolean
ist? Wie bei anderen Optionen könnte der.none
Status anzeigen, dass der Wert noch unbekannt ist. Möglicherweise befindet sich am anderen Ende eines Netzwerkanrufs etwas, dessen Abfrage einige Zeit in Anspruch nimmt. Optionale Boolesche Werte werden auch als " Drei-Wert-Boolesche Werte " bezeichnet.Schnelle Tricks
Swift verwendet einige Tricks, damit Optionen funktionieren. Betrachten Sie diese drei Zeilen mit normal aussehendem optionalem Code.
Keine dieser Zeilen sollte kompiliert werden.
String
die Typen unterschiedlichIch werde einige Implementierungsdetails von Optionen durchgehen, mit denen diese Zeilen funktionieren.
Optional erstellen
Mit
?
einem optionalen erstellen ist syntaktischer Zucker, durch den Compiler Swift aktiviert. Wenn Sie es auf lange Sicht tun möchten, können Sie eine Option wie die folgende erstellen:Dies ruft
Optional
den ersten Initialisierer auf,public init(_ some: Wrapped)
der den zugehörigen Typ des optionalen Typs von dem in den Klammern verwendeten Typ ableitet.Die noch längere Möglichkeit, eine Option zu erstellen und festzulegen:
Optionale Einstellung auf
nil
Sie können eine Option ohne Anfangswert oder eine Option mit dem Anfangswert von erstellen
nil
(beide haben das gleiche Ergebnis).Das Zulassen, dass Optionen gleich sind,
nil
wird durch das ProtokollExpressibleByNilLiteral
(zuvor benanntNilLiteralConvertible
) aktiviert . Das optionale wird mitOptional
dem zweiten Initialisierer erstelltpublic init(nilLiteral: ())
. Die Dokumente sagen, dass SieExpressibleByNilLiteral
nichts anderes als Optionen verwenden sollten, da dies die Bedeutung von Null in Ihrem Code ändern würde, aber es ist möglich, dies zu tun:Mit demselben Protokoll können Sie eine bereits erstellte Option auf festlegen
nil
. Obwohl dies nicht empfohlen wird, können Sie den Null-Literal-Initialisierer direkt verwenden:Vergleich eines optionalen mit
nil
Optionals definieren zwei spezielle "==" - und "! =" - Operatoren, die Sie in der
Optional
Definition sehen können. Mit der ersten==
Option können Sie überprüfen, ob eine Option gleich Null ist. Zwei verschiedene Optionen, die auf .none gesetzt sind, sind immer gleich, wenn die zugehörigen Typen gleich sind. Wenn Sie mit nil vergleichen, erstellt Swift hinter den Kulissen eine Option desselben zugeordneten Typs, die auf .none gesetzt ist, und verwendet diese dann für den Vergleich.Mit dem zweiten
==
Operator können Sie zwei Optionen vergleichen. Beide müssen vom selben Typ sein und dieser Typ muss übereinstimmenEquatable
(das Protokoll, mit dem Dinge mit dem regulären Operator "==" verglichen werden können). Swift packt (vermutlich) die beiden Werte aus und vergleicht sie direkt. Es behandelt auch den Fall, in dem eine oder beide Optionen verfügbar sind.none
. Beachten Sie den Unterschied zwischen dem Vergleich mit demnil
Literal.Darüber hinaus können Sie jeden
Equatable
Typ mit einem optionalen Wrapping dieses Typs vergleichen:Hinter den Kulissen verpackt Swift das Nicht-Optionale vor dem Vergleich als Optional. Es funktioniert auch mit Literalen (
if 23 == numberFromString {
)Ich sagte, es gibt zwei
==
Operatoren, aber es gibt tatsächlich einen dritten, mit dem Sienil
die linke Seite des Vergleichs angeben könnenOptionale benennen
Es gibt keine Swift-Konvention, um optionale Typen anders als nicht optionale Typen zu benennen. Die Leute vermeiden es, dem Namen etwas hinzuzufügen, um anzuzeigen, dass es sich um einen optionalen Typ handelt (z. B. "optionalMiddleName" oder "möglicherNumberAsString"), und lassen die Deklaration anzeigen, dass es sich um einen optionalen Typ handelt. Dies wird schwierig, wenn Sie etwas benennen möchten, das den Wert von einem optionalen Wert enthält. Der Name "middleName" impliziert, dass es sich um einen String-Typ handelt. Wenn Sie also den String-Wert daraus extrahieren, erhalten Sie häufig Namen wie "actualMiddleName" oder "unwrappedMiddleName" oder "realMiddleName". Verwenden Sie die optionale Bindung und verwenden Sie den Variablennamen erneut, um dies zu umgehen.
Die offizielle Definition
Aus "The Basics" in der Swift-Programmiersprache :
Zum Abschluss hier ein Gedicht aus dem Jahr 1899 über Optionen:
Gestern auf der Treppe
traf ich einen Mann, der nicht da war.
Er war heute nicht wieder da.
Ich wünschte, er würde Antigonish weggehen
Mehr Ressourcen:
quelle
if myString
kompiliert nicht mehr. Du brauchstif myString != nil
. Siehe Dokumentation .Nehmen wir das Beispiel eines
NSError
: Wenn kein Fehler zurückgegeben wird, möchten Sie es optional machen, Nil zurückzugeben. Es macht keinen Sinn, ihm einen Wert zuzuweisen, wenn kein Fehler vorliegt.Auf diese Weise können Sie auch einen Standardwert festlegen. Sie können einer Methode also einen Standardwert festlegen, wenn der Funktion nichts übergeben wird
quelle
func isNil<T>(t: T?) -> Bool { return t == nil }
wird zurückgegeben,true
auch wennnil
der Ausdruck einen optionalen Wert enthält .return x == 5
? Was ist das Besondere an 5?Sie können
nil
in Swift keine Variable haben, auf die verweist - es gibt keine Zeiger und keine Nullzeiger. In einer API möchten Sie jedoch häufig entweder eine bestimmte Art von Wert oder einen Wertmangel angeben können - z. B. hat mein Fenster einen Delegaten, und wenn ja, wer ist das? Optionals sind Swifts typsichere und speichersichere Methode, um dies zu tun.quelle
Ich gab eine kurze Antwort, die die meisten der oben genannten Punkte zusammenfasst, um die Unsicherheit zu beseitigen, die ich als Anfänger in meinem Kopf hatte:
Im Gegensatz zu Objective-C kann keine Variable in Swift Null enthalten , daher wurde der optionale Variablentyp hinzugefügt (Variablen mit dem Suffix "?"):
Der große Unterschied besteht darin, dass die optionalen Variablen keine Werte direkt speichern (wie es normale Obj-C-Variablen tun würden). Sie enthalten zwei Zustände : " hat einen Wert " oder " hat null ":
In diesem Fall können Sie diese Variablen in verschiedenen Situationen überprüfen:
Mit dem "!" Mit dem Suffix können Sie auch nur dann auf die darin eingeschlossenen Werte zugreifen, wenn diese vorhanden sind . (dh es ist nicht Null ):
Deshalb müssen Sie "?" und "!" und verwenden Sie nicht alle standardmäßig. (Dies war meine größte Verwirrung)
Ich stimme auch der obigen Antwort zu: Der optionale Typ kann nicht als Boolescher Wert verwendet werden .
quelle
In Ziel C waren Variablen ohne Wert gleich 'nil' (es war auch möglich, 'nil'-Werte wie 0 und false zu verwenden), daher war es möglich, Variablen in bedingten Anweisungen zu verwenden (Variablen mit Werten sind gleich' TRUE ' 'und diejenigen ohne Werte waren gleich' FALSE ').
Swift bietet Typensicherheit durch Bereitstellung eines optionalen Werts. Das heißt, es verhindert, dass Fehler entstehen, die Variablen unterschiedlichen Typs zuweisen.
In Swift können also nur Boolesche Werte für bedingte Anweisungen angegeben werden.
Obwohl 'hw' eine Zeichenfolge ist, kann sie hier nicht in einer if-Anweisung wie in Ziel C verwendet werden.
Dafür muss es erstellt werden als,
quelle
Mit dem optionalen Wert können Sie das Fehlen eines Werts anzeigen. Ein bisschen wie NULL in SQL oder NSNull in Objective-C. Ich denke, dies wird eine Verbesserung sein, da Sie dies sogar für "primitive" Typen verwenden können.
Auszug aus: Apple Inc. "Die schnelle Programmiersprache". iBooks. https://itun.es/gb/jEUH0.l
quelle
nil
ist nur syntaktischer Zucker für die Enum-KonstanteOptionalValue<T>.None
(wobeiT
der Typ dem Kontext entspricht, in dem Sie ihn verwendennil
).?
ist eine Abkürzung fürOptionalValue<T>.Some(T)
.Ein optionales Mittel bedeutet, dass Swift nicht ganz sicher ist, ob der Wert dem Typ entspricht: Zum Beispiel Int? bedeutet, dass Swift nicht ganz sicher ist, ob die Nummer ein Int ist.
1) Wenn Sie sich des Typs absolut sicher sind, können Sie ein Ausrufezeichen verwenden, um das Auspacken wie folgt zu erzwingen:
Wenn Sie ein optionales Entpacken erzwingen und es gleich Null ist, kann dieser Absturzfehler auftreten:
Dies ist nicht unbedingt sicher. Hier ist eine Methode, die einen Absturz verhindern kann, falls Sie sich über Typ und Wert nicht sicher sind:
2) Die implizit ausgepackte Option
3) Die Wachaussage
Von hier aus können Sie die entpackte Variable verwenden. Stellen Sie sicher, dass Sie das Auspacken nur erzwingen (mit einem!), Wenn Sie sich über den Typ der Variablen sicher sind.
quelle
Als ich anfing zu lernen
Swift
, war es sehr schwierig zu verstehen, warum optional .Denken wir so. Betrachten wir eine Klasse
Person
mit zwei Eigenschaftenname
undcompany
.Lassen Sie uns nun einige Objekte von erstellen
Person
Aber wir können nicht passieren
Nil
zuname
Sprechen wir jetzt darüber, warum wir verwenden
optional?
. Betrachten wir eine Situation, in der wirInc
nach dem Firmennamen hinzufügen möchten, wieapple
es sein wirdapple Inc
. Wir müssenInc
nach Firmennamen anhängen und drucken.Lassen Sie uns nun untersuchen, warum optional erfolgt.
Lässt ersetzen
bob
mittom
Und herzlichen Glückwunsch! wir haben richtig damit umgegangen
optional?
Die Realisierungspunkte sind also
nil
nil
.Vielen Dank ... Happy Coding
quelle
Experimentieren wir mit dem unten stehenden Code Playground. Ich hoffe, dass die Idee klar ist, was optional ist und warum sie verwendet wird.
quelle
Von https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/OptionalChaining.html :
Um tiefer zu verstehen, lesen Sie den obigen Link.
quelle
Gut...
Der Hauptunterschied besteht darin, dass die optionale Verkettung ordnungsgemäß fehlschlägt, wenn die optionale Option Null ist, während das erzwungene Entpacken einen Laufzeitfehler auslöst, wenn die optionale Option Null ist.
Um die Tatsache widerzuspiegeln, dass optionale Verkettung für einen Nullwert aufgerufen werden kann, ist das Ergebnis eines optionalen Verkettungsaufrufs immer ein optionaler Wert, selbst wenn die Eigenschaft, Methode oder der Index, den Sie abfragen, einen nicht optionalen Wert zurückgibt. Mit diesem optionalen Rückgabewert können Sie überprüfen, ob der optionale Verkettungsaufruf erfolgreich war (das zurückgegebene optionale enthält einen Wert) oder aufgrund eines Nullwerts in der Kette nicht erfolgreich war (der zurückgegebene optionale Wert ist null).
Insbesondere ist das Ergebnis eines optionalen Verkettungsaufrufs vom gleichen Typ wie der erwartete Rückgabewert, jedoch in einen optionalen Wert eingeschlossen. Eine Eigenschaft, die normalerweise ein Int zurückgibt, gibt ein Int? beim Zugriff durch optionale Verkettung.
Hier finden Sie ein detailliertes Tutorial des Apple Developer Committee: Optionale Verkettung
quelle
Ein optionales Element in Swift ist ein Typ, der entweder einen Wert oder keinen Wert enthalten kann. Optionale Optionen werden durch Anhängen eines ? zu jedem Typ:
Sie können auf diesen Link verweisen, um tiefgreifende Informationen zu erhalten: https://medium.com/@agoiabeladeyemi/optionals-in-swift-2b141f12f870
quelle
Hier ist eine äquivalente optionale Deklaration in Swift:
Diese Deklaration erstellt eine Variable mit dem Namen middleName vom Typ String. Das Fragezeichen (?) Nach dem Variablentyp "String" gibt an, dass die Variable "middleName" einen Wert enthalten kann, der entweder "String" oder "Null" sein kann. Jeder, der sich diesen Code ansieht, weiß sofort, dass MiddleName Null sein kann. Es ist selbstdokumentierend!
Wenn Sie keinen Anfangswert für eine optionale Konstante oder Variable angeben (wie oben gezeigt), wird der Wert für Sie automatisch auf Null gesetzt. Wenn Sie möchten, können Sie den Anfangswert explizit auf Null setzen:
Weitere Informationen zum optionalen Link finden Sie unter dem folgenden Link
http://www.iphonelife.com/blog/31369/swift-101-working-swifts-new-optional-values
quelle