Swift legt großen Wert auf Typensicherheit. Die gesamte Swift-Sprache wurde unter Berücksichtigung der Sicherheit entwickelt. Es ist eines der Markenzeichen von Swift und eines, das Sie mit offenen Armen begrüßen sollten. Es hilft bei der Entwicklung von sauberem, lesbarem Code und verhindert, dass Ihre Anwendung abstürzt.
Alle Optionen in Swift sind mit dem ?
Symbol gekennzeichnet. Durch die Einstellung des ?
in nach dem Namen des Typs , die Sie erklärt werden als optional Sie sind im Wesentlichen Gießen dies nicht als Typ , in dem vor dem ?
, sondern als optionalem Typ.
Hinweis: Eine Variable oder ein Typ Int
ist nicht identisch mit Int?
. Es handelt sich um zwei verschiedene Typen, die nicht miteinander betrieben werden können.
Optional verwenden
var myString: String?
myString = "foobar"
Dies bedeutet nicht , dass Sie mit einer Art von arbeiten String
. Dies bedeutet, dass Sie mit einem Typ von String?
(String Optional oder Optional String) arbeiten. In der Tat, wann immer Sie versuchen
print(myString)
Zur Laufzeit wird die Debug-Konsole gedruckt Optional("foobar")
. Der Optional()
Teil " " gibt an, dass diese Variable zur Laufzeit einen Wert haben kann oder nicht, enthält aber gerade die Zeichenfolge "foobar". Diese " Optional()
" -Anzeige bleibt bestehen, es sei denn, Sie führen den so genannten "Auspacken" des optionalen Werts durch.
Das Auspacken eines optionalen Elements bedeutet, dass Sie diesen Typ jetzt als nicht optional umwandeln . Dadurch wird ein neuer Typ generiert und der Wert, der sich in diesem optionalen Typ befand, dem neuen nicht optionalen Typ zugewiesen. Auf diese Weise können Sie Operationen für diese Variable ausführen, da vom Compiler ein fester Wert garantiert wurde.
Das bedingte Auspacken prüft, ob der Wert in der Option optional ist nil
oder nicht. Ist dies nicht der nil
Fall, gibt es eine neu erstellte Konstantenvariable, der der Wert zugewiesen und in die nicht optionale Konstante entpackt wird . Und von dort aus können Sie das nicht optionale im if
Block sicher verwenden .
Hinweis: Sie können Ihrer bedingt entpackten Konstante denselben Namen geben wie der optionalen Variablen, die Sie entpacken.
if let myString = myString {
print(myString)
// will print "foobar"
}
Das bedingte Auspacken von Optionen ist die sauberste Möglichkeit, auf den Wert eines optionalen Elements zuzugreifen. Wenn dieser einen Nullwert enthält, wird alles im if let-Block nicht ausgeführt. Natürlich können Sie wie jede if-Anweisung einen else-Block einfügen
if let myString = myString {
print(myString)
// will print "foobar"
}
else {
print("No value")
}
Das gewaltsame Auspacken erfolgt durch Verwendung des sogenannten !
("Knall") - Operators. Dies ist weniger sicher, ermöglicht jedoch das Kompilieren Ihres Codes. Wenn Sie jedoch den Bang-Operator verwenden, müssen Sie zu 1000% sicher sein, dass Ihre Variable tatsächlich einen festen Wert enthält, bevor Sie sie zwangsweise auspacken.
var myString: String?
myString = "foobar"
print(myString!)
Dies ist ein vollständig gültiger Swift-Code. Es druckt den Wert aus myString
, der als "foobar" eingestellt wurde. Der Benutzer würde foobar
in der Konsole gedruckt sehen und das war's auch schon. Nehmen wir jedoch an, der Wert wurde nie festgelegt:
var myString: String?
print(myString!)
Jetzt haben wir eine andere Situation in den Händen. Im Gegensatz zu Objective-C stürzt der Versuch ab, eine Option zwangsweise zu entpacken, und die Option wurde nicht festgelegt nil
. Wenn Sie versuchen, die Option zu entpacken, um zu sehen, was in Ihrer Anwendung enthalten ist, stürzt sie ab.
Auspacken mit Typ Casting . Wie bereits erwähnt, können Sie, obwohl Sie unwrapping
optional sind, tatsächlich in einen nicht optionalen Typ umwandeln, das nicht optionale jedoch auch in einen anderen Typ umwandeln. Beispielsweise:
var something: Any?
Irgendwo in unserem Code wird die Variable something
mit einem Wert gesetzt. Vielleicht verwenden wir Generika oder es gibt eine andere Logik, die dazu führt, dass sich dies ändert. Später in unserem Code möchten wir ihn verwenden, können ihn something
aber dennoch anders behandeln, wenn es sich um einen anderen Typ handelt. In diesem Fall möchten Sie das as
Schlüsselwort verwenden, um dies zu bestimmen:
Hinweis: Mit dem as
Operator geben Sie cast in Swift ein.
// Conditionally
if let thing = something as? Int {
print(thing) // 0
}
// Optionally
let thing = something as? Int
print(thing) // Optional(0)
// Forcibly
let thing = something as! Int
print(thing) // 0, if no exception is raised
Beachten Sie den Unterschied zwischen den beiden as
Schlüsselwörtern. Wie zuvor, als wir eine Option gewaltsam ausgepackt haben, haben wir dazu den !
Bang-Operator verwendet. Hier werden Sie das Gleiche tun, aber anstatt nur als nicht optional zu gießen, gießen Sie es auch als Int
. Und es muss in der Lage sein, niedergeschlagen zu werden, da Int
sonst die Verwendung des Bang-Operators, wenn der Wert nil
Ihre Anwendung ist, abstürzt.
Und um diese Variablen überhaupt in irgendeiner Art oder mathematischen Operation zu verwenden, müssen sie dazu ausgepackt werden.
Beispielsweise dürfen in Swift nur gültige Nummerndatentypen derselben Art aufeinander angewendet werden. Wenn Sie einen Typ mit dem as!
umwandeln, erzwingen Sie den Downcast dieser Variablen, als ob Sie sicher sind , dass es sich um diesen Typ handelt. Daher können Sie sicher arbeiten und Ihre Anwendung nicht zum Absturz bringen. Dies ist in Ordnung, solange die Variable tatsächlich von dem Typ ist, auf den Sie sie übertragen, da Sie sonst ein Durcheinander in Ihren Händen haben.
Durch das Casting mit as!
kann Ihr Code jedoch kompiliert werden. Beim Casting mit einem as?
ist eine andere Geschichte. In der Tat as?
erklärt Sie Int
als völlig anderen Datentyp alle zusammen.
Jetzt ist es Optional(0)
Und wenn Sie jemals versucht haben, Ihre Hausaufgaben zu machen, schreiben Sie so etwas wie
1 + Optional(1) = 2
Ihr Mathematiklehrer hätte Ihnen wahrscheinlich ein "F" gegeben. Gleiches gilt für Swift. Nur dass Swift lieber gar nicht kompilieren möchte, als Ihnen eine Note zu geben. Denn am Ende des Tages kann die Option tatsächlich Null sein .
Sicherheit geht vor Kinder.