“The Swift Programming Language”と”Using Swift with Cocoa and Objective-C”の”Working with nil”とかを読んだ上で自分なりにオプショナル型の使い方をまとめると、
- 純Swiftプログラミングの場合:
- 失敗する可能性のある処理の結果を返す
(ダウンキャストや辞書のルックアップ、オプショナル型参照からのチェイン) - 文字通りオプショナルなプロパティや引数を表すために用いる
- 失敗する可能性のある処理の結果を返す
- Cocoa提供クラスのメソッドをオーバーライドしたり、デリゲートメソッドを実装する場合など:
- 元々のObjective-C環境において、引数にポインタとしてインスタンスを受け取っていたメソッドの場合、非nil値を保証するための仕組みは言語仕様上は何も無かったので、Swift環境においても実装上nilを受け取れるようにオプショナル型を使用する。
ただし、設計/仕様上、常に非nil値を受け取ることが分かっているのであれば、暗黙的にアンラップされるオプショナル型として宣言し、ノーチェックでアクセスするのは自由。
- 元々のObjective-C環境において、引数にポインタとしてインスタンスを受け取っていたメソッドの場合、非nil値を保証するための仕組みは言語仕様上は何も無かったので、Swift環境においても実装上nilを受け取れるようにオプショナル型を使用する。
…てな感じで理解していたのですが、Appleが公開しているListerサンプルコードのほげほげViewControllerでオーバーライドしているメソッド群を見ると、フツーにtableViewとかの引数に非オプショナル型を使用しているんですね。うーん??
さらにApple以外の一般の方が公開しているサンプルコードを見ても、同じクラス/プロトコル同じメソッドの引数でも人によって非オプショナル型だったりオプショナル型(型名?)だったり暗黙的にアンラップされるオプショナル型(型名!)だったりするような…。
…もう少し情報が増えるまで、ひとまず忘れよう!
Stack Overflowのswiftタグをちょこちょこ見始めたのですが、GAIJINの皆さんも"暗黙的にアンラップされるオプショナル型”の有効な使い道にちょっと困ってるっぽい?