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