tasuwo blog

[Swift] Optional型まとめ

| Comments

Optional型がよくわからなかったのでまとめておく.
定義のメモだけなので,使い方とかもそのうち追記していきたい.

Optional型とは?

nil を許す型のこと.

宣言

型に?を付加すると,Optional型を宣言できる.
ちなみにT?Optional<T>のシンタックスシュガー.

1
2
3
var optionalSuger: Int?           // Optional型の宣言.初期値はnil.
var optional:      Optional<Int>  // Int? と同じ意味
var notOptional:   Int            // 非Optional型.初期値は空(nilですらない)

wrap と unwrap

TT?は違う型.
同様に扱うためにはunwrapする必要がある.

  • unwrapとは?
    • Optional型からT型の変数を取り出すこと.

unwrapの方法には以下の4種類がある.

  1. Forced unwrapping
  2. Optional Chaining
  3. Optional Binding
  4. 比較演算子
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
////////////////////////////////////////////
// Optional型の宣言
class Dog {
    func bark() -> String {
        return "BowWow!"
    }
}
var wrappedDog: Dog? = Dog()

////////////////////////////////////////////
// 1. Forced Unwrapping
//    「!」を付加する.
//    値が nil だった場合はランタイムエラー.
println(wrappedDog!.bark)           // "BowWow!"

////////////////////////////////////////////
// 2. Optional Chaining
//    「?」を付加する
//    値が nil だった場合は nil を返す.
//    最終的な戻り値は Optional型 となる.
println(wrappedDog?.bark())         // Optional("BowWow!")

////////////////////////////////////////////
// 3. Optional Binding
//    if,while 等の条件式内で宣言,代入されると unwrap される.
//    値が nil の場合は条件式が false となる.
if var unwrappedDog = wrappedDog {
    println(unwrappedDog.bark())    // "BowWow!"
}

////////////////////////////////////////////
// 4. 比較演算子
//    比較演算子を使うと unwrap される.
var wrappedInt: Int? = 1
println(wrappedInt == 1)            // "true"

Implicitly Unwrapped Optional型とは?

型に!を付加すると,Implicitly Unwrapped Optional型を宣言できる.
ちなみにT!ImplicitlyUnwrappedOptional<T>のシンタックスシュガー.

1
2
3
4
5
6
7
8
9
10
var iuOptionalSuger: Int!                              // Implicitly Unwrapped Optional型の宣言.初期値はnil.
var iuOptional:      ImplicitlyUnwrappedOptional<Int>  // Int! と同じ意味
var Optional:        Int?                              // Optional型

iuOptional = 1
Optional   = 1

// 自動的に unwrap される.
println(iuOptional)    // "1"
println(Optional)      // "Optional(1)"

比較演算子:??

nil かどうか判定する比較演算子.
a ?? ba != nil ? a! : bのシンタックスシュガー.

1
2
3
4
var wrappedInt: Int?
ptinrln(wrappedInt ?? 2)    // "2"
wrappedInt = 1
println(wrappedInt ?? 2)    // "1"

参考サイト

Swift Optional 型についてのまとめ Ver2
SwiftのOptional型を極める

Comments