[iOS 8] Android脳に効く!新言語「Swift」超入門 #2 Optional基礎
Optionalってなんだろう?
Optionalとはその名の通りオブジェクトにオプション(選択権)を持たせる機能です。
Swiftではオブジェクトを堅牢に扱えるように、変数・定数にnilを代入することが禁止されています。しかし、このままでは「オブジェクトが存在しない状態」を扱うことができません。
そのため、SwiftではOptionalによって「nilの保持」というオプションを持たせ、状況によって選択できるようにしています。
CHECK!
Android開発者にはなじみのないnilですが、Javaでいうところのnullと同じようなものだと考えておけばよいでしょう。しかし、実際には別物であるということを忘れてはいけません。
イメージをつかむ
JavaにはOptionalのような機能はありません。実際のコードを見てイメージをつかんでみましょう。
Java Code
String firstName; // null String lastName = null; firstName = "Udai"; lastName = "Yokoyama";
よく見る変数の宣言、初期化、代入ですね。変数の宣言と同時に初期化を行わなければ変数はnullになりますし、nullで初期化をすればもちろんnullとなります。
このように、Javaではnullの扱いを特別意識することはありませんでした。
これをSwiftで書くとどのようになるでしょうか。
Swift Code
var name: String = nil // nilの代入が禁止されている // コンパイルエラー var firstName: String? = "Udai" firstName = nil // nilの代入ができる var lastName: String? = nil // nil firstName = "Udai" lastName = "Yokoyama"
まず、[1行目]のようにOptionalを適用しない場合はnilの代入ができないのでコンパイルエラーになります。しかし、[6行目]に注目してください。nilを代入してもエラーにはなりません。
このnilの代入を可能にした秘密は[4行目]にあります。不可解な記号にお気づきでしょうか。型の後ろに?がついています。これがOptionalの正体です。
型の後ろに?をつけることで、nilの代入が可能になります。
このようにオブジェクトが存在しない状態の扱い方がJavaとSwiftでは大きく異なり、混乱しやすいポイントです。 そもそもなぜSwiftはこのような振る舞いをするのか?という点については、冒頭でお話した通りオブジェクトを堅牢に扱う為です。Optionalを使わなければオブジェクトがnilになることはありません。そのため、オブジェクトがnilである可能性を無視することができます。
wrapとunwrapの考え方
まず、次のコードを見てください。
Swift Code
// nameは何型? var name: String? = "Udai Yokoyama" // 出力結果は? println(name) // Optional("Udai Yokoyama")
[2行目]の変数nameは何型になるでしょうか。
一見するとString型のようにも見えますが、これはOptional型です。
Optional型の文法
?はOptional〈T〉を扱いやすく書き換えているシンタックスシュガーです。どちらで記述しても同じ意味ですが、その容易さから主に?を用いることになるでしょう。また、Optionalを使うときには必ず型の指定を行う必要があります。
このように、?はOptional〈T〉のT型に縛られたOptional型を表します。また、サンプルコード[2行目]のようなOptional型の変数のことをwrap(ラップ)されているといいます。
ラップされた変数を使用するときにはunwrap(アンラップ)します。先ほどのサンプルコードを少し書き換えてみましょう。
Swift Code
var name: String? // nil name = "Udai Yokoyama" // unwrap println(name!) // Udai Yokoyama
ラップされた変数をアンラップする方法はいくつか用意されていますが、ここでは!を使用したForced Unwrappingを用いてアンラップをしました。変数をアンラップすることでString型の値を取り出すことができます。
まとめ
Optionalには今回書いたものの他に、非常に多くの利用シーンがあります。
まずは、基礎的な部分を理解しSwiftで?や!が出てきたときにOptionalによってnilを制御しているということがわかるようにしておくといいと思います。
次回は制御構造についてです。
バックナンバー
[iOS 8]Android脳に効く!新言語「Swift」超入門 #1 変数の宣言と型
[iOS 8]Android脳に効く!新言語「Swift」超入門 #2 Optional基礎
[iOS 8]Android脳に効く!新言語「Swift」超入門 #3 制御構造
[iOS 8]Android脳に効く!新言語「Swift」超入門 #4 関数とクロージャ
[iOS 8]Android脳に効く!新言語「Swift」超入門 #5 クラスとストラクチャ