SwiftのOptionalは単なる一つのenum!


スタンフォード大学のiTunes Universityの講義は質が高いのでたまに聴いているのですが、以下のランキング常に上位にいる講義の「4. More Swift and Foundation Frameworks」という回の冒頭でOptionalの説明が目から鱗だったのでシェア。

Developing iOS 8 Apps with Swift (Stanford Univ.)
https://itunes.apple.com/jp/course/developing-ios-8-apps-swift/id961180099

「Optionalとは?」という疑問に対して一言「Optionalは単なる一つのEnumである。」という説明がされていました。

optional

これまで「nilを許容するクラス」という認識だけで、割と適当にコンパイラーに怒られながら?や!を使っていました。

上のスライドの説明で十分なのですが、簡単に解説します。

genericを使ったOptinalという名前のenumがあるとします。

enum Optional<T> {
    case None
    case Some(T)
}

さて、swiftのコードでOptionalの変数にnilを代入する例を見てみましょう。

let x: String? = nil

これはつまり、

let x = Optional<String>.None

上のように、変数xにはOpitonalというenumの持つ一つの値(None)を代入しているんです。

次の例はnilでなくStringを代入してみる通常のswiftの例です。

let x: String? = "hello"

これはもうお分かりかもしれませんが、以下のようにgenericで指定した型を持つ値を受け取ったenumの値(Some)がxに代入されます。

let x = Optional<String>.Some("hello")

ふむふむ。
ではOptionalの値に!をつけて実行した時にどうなるかというと、例えば以下の例。

var y = x!

xに!をつけたものを別の変数に代入しています。今まではなんとなくオプショナルがオプショナルじゃない型になるのか、という程度に扱ってた部分。nilだった場合はerrorになりますよね。

これは以下の式が実行されます。

switch x {
    case Some(let value): y = value
    case None: // error!
}

yに代入しようとしているオプショナルの変数がSomeであったら、enumの引数として指定していた値をyに代入して、Noneであったらerrorになるということです。

おおおおお…!!!

ということで確かにOptionalは単なるenumで、そう考えると途端に扱いやすくなってきました。
もっと前から知っておきたかった基本的な知識。自分はとてもすっきりしました…!(でも、もしかすると常識なのかな。)

他にもこの講義聞いてると目から鱗なことがあったので、また別の記事で紹介します。