質問: Swiftの Optional 型 - nil の代入を許す 非 optional 型 - nil の代入を許さない があり、Optional型にするに「?」を使い、unwrapping(nilを排除)するのに「!」を使います。 しかし、よくあるコードで ``` var mMoviewPlayerView : MPMoviePlayerController! ``` の「!」はいまいちしっくりこないのです。 (1) MPMoviePlayerControllerやUIViewはもともとnilがあり、それをunwappingしたものを宣言しているのか? (2) 宣言しているだけならば、中身はnilだと思うのですが何故エラーが出ないのでしょうか? ご存知の方、ご教示お願いします。
回答: ``` var mMoviewPlayerView : MPMoviePlayerController! ``` この宣言は、`Implicitly Unwrapped Optional`と呼ばれるものです。その名の通り、「暗黙のうちに`unrwap`が行われる`Optional`」です。 `Optional`とは値として`nil`を許容しますが、`nil`を`unrwap`して利用しようとした場合に、実行時エラーを発生させる仕組みでした。 1. `Implicitly Unwrapped Optional`も`Optional`の一種なので`nil`を取りうることができます。そのため、宣言時に`nil`であってもエラーは起きません。 2. `nil`と評価されている状態で、値にアクセスすると暗黙のうちに`unrwap`が発生した結果、実行時エラーとなります。 なぜ`Implicitly Unwrapped Optional`が用いられるのでしょう。 これはプログラミングするタイミングで必ず`nil`以外の値が入っていることが保証されるケースにおいて、`unrwap`や`Optional Binding`の記述で冗長になることを防ぐためだと考えられます。 「必ず`nil`が入らないのであれば、そもそも`Optional`にする必要もない」ように感じます。 しかし`MPMoviePlayerController`のようなGUI部品は、常にメモリ上にロードされているわけではありません。`UIViewController`のライフサイクルの中で、必要に応じて初期化・解放が行われるため、このような仕組みの方が都合がよいのです。