しめ鯖日記

swift, iPhoneアプリ開発, ruby on rails等のTipsや入門記事書いてます

SwiftのOptional型って実は列挙型だった

SwiftのOptional型について深く調べてみたのでメモ。

Optional型の概要

Optional型とは下のように?付きで宣言された変数の型の事を指します。

// この2つはOptional型
let a: Int? = 1
let b: String? = 1

そうなってくると「上の変数はInt型でありOptional型ってこと?」って思うのですが、実は上の変数はInt型ではなくOptional型なのです。
下の例を見てもらうと分かる通り、Int?と言うのはOptionalと同義です。

let a: Int? = 1
let b: Optional<Int> = 1
print(a == b) // → true

Optional型の中身

Optional型の実装ですが、下の通り列挙型になります。

enum Optional<T> : Reflectable, NilLiteralConvertible {
    case None
    case Some(T)

    // メソッドは省略...
}

下の通り、NoneとはnilでSomeはnil以外になります。

let a : Optional<Int> = nil
let b : Optional<Int> = 1
print(a == Optional.None) // → true
print(b == Optional.Some(1)) // → true

その他

Optional型のアンラップ

先日の記事でも書いたのですが、変数に!を付ける事はアンラップと呼びます。
これはオプショナル型の変数から中身を取り出す事です。

let a : Int? = 1
print(a) // → Optional(1)
print(a!) // → 1 アンラップする事でInt型の1を習得

Optional型の中にOptional型を入れる

Optional型は実は下のように2重にする事ができます。
使う事があるかは分からないですがなんとなく面白いですね。

let a : Int?? = 1
print(a) // → Optional(Optional(1))
print(a!) // → Optional(1)
print(a!!) // → 1

let a : Int?? = 1
print(a) // → Optional(Optional(1))
print(a!) // → Optional(1)
print(a!!) // → 1