

この画像の部分の説明では変数にnilが代入されているときに「!」をつけると命令が実行されるタイミングでクラッシュすると書いてあります。(<https://i.stack.imgur.com/PwDZ8.jpg>)!  
しかし次のページのこちらの画像ではコードに「！」がついてるのに、変数にnilを代入すると書いてあります。どういうことでしょうか？(<https://i.stack.imgur.com/emKQk.jpg>)


CC BY-SA 3.0
2017-10-04T15:05:40.703
38434
2017-10-05T00:52:03.527
25534
question
swift
swiftのnilという機能について


クラッシュするのは実行したときに`nil`の変数を`!`で強制アンラップしたときなので、`!`で強制アンラップする前に`nil`ではない値がセットされることが確実なら問題ありません。

この`ViewController`はStoryboardによってインスタンス化されることが前提になっています。Storyboardが`ViewController`をインスタンス化するときに、`@IBOutlet`を指定して、かつStoryboard上のUIコンポーネントを接続したプロパティはStoryboardによって自動的にプロパティのインスタンスが作られ（例の場合はUILabel）`ViewController`のプロパティに代入されます。

つまり、`ViewController`のインスタンス化と`@IBOutlet`のプロパティの代入は同時には行えません。どうしても`ViewController`を先にインスタンス化することになります。

このように`ViewController`をインスタンス化してから`@IBOutlet`のプロパティが代入されるまでには時間のずれがあり、その間はこの`label`プロパティには`nil`が設定されているということです。`nil`がセットされていることがほんの一瞬ですがあるために、このプロパティはOptionalにしなければなりません。

実際は`ViewController`が使えるようになるまでには`label`プロパティにはStoryboardによってインスタンスが代入されているので、実行時にはこのプロパティが`nil`になることはない、と保証できるので`!`を使って強制アンラップしても、実行時には`nil`ではないので問題ないということです。

（本来はOptionalや`!`を使わなくても良い仕組みである方が望ましいのですが、Storyboardや`@IBOutlet`の仕組みはSwiftの登場以前からあるものなので、Swiftの言語仕様との兼ね合いで仕方なくこのようになっています）


CC BY-SA 3.0
2017-10-05T00:52:03.527
38441
2017-10-05T00:52:03.527
5519
38434
answer