[iOS 8] Android脳に効く!新言語「Swift」超入門 #2 Optional基礎

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

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型の文法

optionalk_syntax

?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 クラスとストラクチャ