2016-05-05 22 views
1

Während um mit Swift spielen stieß ich auf das folgende Szenario:Seltsames Verhalten von Swift

let testVar: String = "random string" 
var myVar: Int! = 0 
myVar = Int(testVar) 
print("myVar = \(myVar)") 

Ausgang: -

myVar = nil

Da ich ! Zeichen verwendet haben vor myVar, soll es nicht non-Null-Werte die ganze Zeit enthalten? Wie kommt myVar ist nil? Hier ist der Screenshot von meinem Spielplatz Code:

Screenshot

+0

dann was sind Ihre Erwartungen. Soll der Spielplatz abgestürzt sein? –

+0

Erprobt den gleichen Code in einem xcode-Projekt und die Ausgabe bleibt gleich. Erwartete einen Absturz. –

Antwort

1

Das '!' zeigt das erzwungene Auspacken eines optionalen Objekts an. Es ist jedoch immer noch optional und kann daher Null sein.

(Sie sagen nur dem Compiler, dass Sie es garantiert nicht Null geworden.)

Eine Zeile wie ...

let v: Int = myVar 

... am Ende Ihres Code wird Ihnen den Crash bringen, den Sie erwarten.


Ein weiteres Beispiel ist die Art und Weise Stellen behandelt werden. Sie sind in der Regel definiert, wie:

@IBOutlet weak var detailDescriptionLabel: UILabel! 

Bevor viewDidLoad genannt wird, ist es gleich Null. Nochmals, das '!' ist nur ein Versprechen für den Compiler, dass es nicht verwendet wird, bis es eine gültige Referenz enthält.

+0

Danke @Phillip. Dein Beispiel hat meine Zweifel ausgeräumt. Um nur Ihre Antwort hinzuzufügen, finden Sie diese in der offiziellen Dokumentation von Apple - "Wenn ein implizit nicht ausgepacktes optionales NULL ist und Sie versuchen, auf seinen umschlossenen Wert zuzugreifen, lösen Sie einen Laufzeitfehler aus. Das Ergebnis ist genau das gleiche wie wenn Sie ein Ausrufezeichen nach einem normalen optionalen Wert setzen, der keinen Wert enthält. " Auszug aus: Apple Inc." Die Swift-Programmiersprache (Swift 2.1). "IBooks. https://itun.es/in/jEUH0.l " –

0

Ich denke, es ist becuuse Sie Ihre testVar zu einem int Umwandlung, wenn es sich um eine string ist. Da myVar ausgepackt ist, kann es sich um null handeln