Ich habe diesen Code auf der Swift-Site und in verschiedenen Posts hier gesehen und versuche, die Grundlagen zu verstehen. Wie wird diese Linie bewertet?
if let name = optionalName {
Ich bin verwirrt, weil es nicht name == optionaler Name ist, sondern den Wert zuweist. Wie ist dieser Bericht wahr und warum ist er nicht wahr, wenn Sie ihn durch john appleseed mit nil ersetzen, da er immer noch gleich sein wird?
var optionalName: String? = "John Appleseed"
var greeting = "Hello!"
if let name = optionalName {
greeting = "Hello, \(name)"
}
if-statement
swift
DeadZero
quelle
quelle
if let
Syntax als optionale Bindung bezeichnet.Antworten:
Im Wesentlichen heißt es in der Zeile: "Wenn Sie die neue Variable
name
der nicht optionalen Version von entsprechen lassen könnenoptionalName
, gehen Sie wie folgt vor". Wie Martin betonte, wird dies als optionale Bindung bezeichnet .Der einzige Zweck besteht darin, zu testen, ob eine optionale Variable einen tatsächlichen Wert enthält, und das nicht optionale Formular an eine temporäre Variable zu binden. Dies ist der sichere Weg, um eine Option zu "entpacken" oder mit anderen Worten auf den in der Option enthaltenen Wert zuzugreifen. Es wird in keiner Weise auf Gleichheit jeglicher Art geprüft. Es wird nur geprüft, ob innerhalb eines optionalen Werts ein Wert vorhanden ist.
quelle
if let
wir bei Verwendung den Wert an eine nicht optionale Variable binden (name
in diesem Beispiel). Ihr Beispiel würde nicht kompiliert, da jetzt keine Variable mehr aufgerufen wirdname
. Wenn Sie Ihr Beispiel ändern, umoptionalName
es zu verwenden, wird es als gedrucktHello, Optional("John Appleseed")
. Sie können erzwungenes Entpacken verwenden, nachdem Sie gegen Null geprüft haben.Hello, \(optionalName!)
Dies ist jedoch nur fehleranfälliger, wenn Sie diesen Codeabschnitt ohne Prüfung an einen anderen Ort verschieben.Ein optionales ist entweder gesetzt oder nicht gesetzt (nicht null oder null) ... was uns eine wichtige Entscheidung lässt. "Wie sollen wir unseren Code schreiben, damit er für 2 beide Zustände korrekt funktioniert?" Die Art und Weise, wie wir das Optionale auspacken, entscheidet für uns.
Es gibt verschiedene Ansätze, mit denen Sie einer nicht festgelegten Option entgegenwirken können.
Nachfolgend sind die 4 Ansätze aufgeführt
Das erzwungene Auspacken stürzt ab, wenn Sie keinen Wert haben. Sie möchten dies tun, wenn dieser Wert von entscheidender Bedeutung ist, z. B. der Titel eines Films (jeder Film MUSS einen Namen haben).
!
wird zum erzwungenen Auspacken verwendet.Die Verwendung von Null-Koaleszenz ist eine weitere Möglichkeit, die Ihnen mehr Kontrolle gibt. Dies bedeutet, dass sie nicht abstürzt, wenn der Wert nicht festgelegt ist, und dass sie auch nichts festlegt, wenn sie nicht festgelegt wird. Sie würde das tun, was Sie ihnen sagen Dies würde z. B. den Namen des Films standardmäßig auf untitled_movie setzen, wenn kein Name festgelegt wäre.
??
wird für die Nullverschmelzung verwendet.Die Verwendung der optionalen Verkettung führt zu nichts, wenn Sie keinen Wert haben, und legt den Wert fest, wenn Sie einen Wert haben. Sie tun dies für etwas, dessen Wert nicht von entscheidender Bedeutung ist, z. B. für den Namen des Agenten Ihres Schauspielers .
?
wird für die optionale Verkettung verwendet.Wenn Sie
if-let
(oderguard
zwei verschiedene Arten der optionalen Bindung ) verwenden, erhalten Sie mehr Kontrolle . Es stürzt nicht ab, wenn der Wert nicht festgelegt ist. Wenn der Wert festgelegt ist, können Sie etwas tun. Wenn es nicht festgelegt ist, können Sie eineelse
Anweisung hinzufügen .Dies ist die am häufigsten verwendete Methode zum Auspacken, da vom erzwungenen Auspacken etwas abgeraten wird. Weitere Informationen darüber, warum davon abgeraten wird, finden Sie hier . Für einen guten Vergleich zwischen
guard
undif-let
sehenguard vs. if-let
Randnotiz:
Optionale Bindung und optionale Verkettung werden üblicherweise zusammen verwendet:
quelle
Die if-Syntax akzeptiert 2 verschiedene Bedingungen. Die zweite, eine optionale Bindung, ist kein Boolescher Wert. Das ist verwirrend, wie Sie schreiben können:
aber nicht
Apple- Dokumentation (Swift-Referenz):
quelle
if
Nimmt nur boolesche Ausdrücke an, ansonsten würde dies einen Fehler auslösen, so dass dieses Code-Snippet sagtWenn optionalName null ist, ist die Bedingung falsch und die Anweisung else wird ausgeführt. Wenn optionalName jedoch einen Wert hat, wird der optionale Wert in die konstante Variable, dh name, entpackt / zugewiesen.
quelle
Wenn Sie mit schwachen Referenzen und optionalen Typen arbeiten, ist es besser, diese zu verwenden , um Ihren Code zu schützen und Abstürze zu vermeiden. Hier sind die Beispiele
quelle