ベルマークのない自由帳

ベルマークのない自由帳

有益と無益の境界例

iOS開発メモ No.23 -Optional型のアンラップ(unwrap)について-

ただでさえわかりづらいOptional型についてまわる「unwrap」「unwrapped」「unwrapping」という単語群。
かんたんに整理してみた。

そもそもOptional型とは?

nilを許容する変数をOptional型といい、宣言時に明示した型の末尾に?!をつける。
詳しい説明はこちらが最高にわかりやすい。
qiita.com

アンラップ(unwrap)とは?

unwrap[`ʌnrˈæp]:包装を解く
ということ。

じゃあすまなくて、
アンラップは「Optional型変数(の値)の包装を解いて普通の変数(非Optional型)にしてやる」こと。
別の言い方をすれば Optional型変数の値がnilでないことを保証する こと

通常、Optional型変数の値は非Optional型変数の値は一緒に扱うことができない。

var optionalInteger: Int? = 10
var normalInteger: Int = 10

print(optionalInteger + normalInteger)
    -> value of optional type 'Int?' not unwrapped; did you mean to use '!' or '?'?

どういうことか?

var optionalInteger: Int? = 10
var normalInteger: Int = 10

print(optionalInteger)
    -> optional(10)
print(normalInteger)
    -> 10

Optional型は10を代入しても単に10とはならず、optional(10)となっている。
このoptional()の部分(包装)を解いてあげるのがアンラップという作業。
このとき、値がなければnil となってアンラップできない(対象が存在しない)。
繰り返しになるけどアンラップ = nilでないことを保証すること。

アンラップの方法

主に3つ方法がある。
(他にもあるのかは知らない)

Forced Unwrapping

オプショナル型変数の後ろに!をつけるだけで、値を非オプショナルにできる(アンラップできる)お手軽な方法。
多分1番使うけど、問題点として「オプショナル型変数に値が入っていない(nil)場合はエラー」となるので気をつける。

var optionalInteger: Int? = 10
var normalInteger: Int = 10

print(optionalInteger! + normalInteger)
    -> 20

Optional Bind

if文を使うことでOptional型がnilかどうか判定して、値があればその値を取得してif文内の処理を実行。
そのとき、値はアンラップされた上で変数(下記ではname)に代入される。

var userName: String? = “Sota”

if let name = userName {
    print("Hello, \(name)!")
} else {
    print("Get out here!!!")
}
    -> Hello, Sota!

nilならfalseとなってif文内の処理はスキップされる。

var userName: String? = nil
if let name = userName {
    print("Hello, \(name) !")
} else {
    print("Get out here!!!")
}
    -> Get out here!

Optional Chaining

把握していないので以下のページを見てほしい。 qiita.com