2016-05-05 7 views
1

の奇妙な振る舞い、私は次のシナリオに出くわしたスウィフトで遊んでいる間:スウィフト

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

出力: -

myVarに= nilの

私は!マークを使用しているので、 myVarの前に、常にnil以外の値を含むはずがありませんか? どうしてmyVarnilになるのですか?

Screenshot

+0

あなたの期待は何ですか。遊び場は墜落するはずですか? –

+0

xcodeプロジェクトで同じコードを試しても、出力は変わりません。クラッシュが予想されていた。 –

答えて

1

'!'オプションの強制アンラッピングを示します。しかし、タイプはまだオプションであるため、ゼロにすることができます。

(あなたはちょうどあなたがゼロになることはありません、それを保証するコンパイラを言っている。)

ラインのような...

let v: Int = myVar 

を...あなたの終わりにコードはあなたが期待するクラッシュを得るでしょう。


別の例は、出口が処理される方法です。それらは一般に次のように定義されます。

@IBOutlet weak var detailDescriptionLabel: UILabel! 

viewDidLoadが呼び出される前は、nilです。再び、 '!'有効な参照が含まれるまで使用されないというコンパイラの約束です。

+0

ありがとう@Phillip。あなたの例は私の疑いを明らかにした。あなたの答えに追加するだけで、アップル社の公式ドキュメントに見つかりました。 "暗黙的にアンラップされたオプションがnilで、ラップされた値にアクセスしようとすると、ランタイムエラーが発生します。結果は、値を含まない通常のオプションの後に感嘆符を置いた場合とまったく同じです。 " 抜粋:アップル社の" Swift Programming Language(Swift 2.1) ".iBooks。 https://itun.es/in/jEUH0.l " –

0

私はそれがstringあるとき、あなたのtestVarintに変換するbecuuseそれだと思う: はここに私の遊び場コードのスクリーンショットです。 myVarは展開されていないので、デフォルトではnilになる可能性があります。