経緯
swiftアンラップ処理についてようやく理解でき始めたので、
頭の整理と、備忘録を兼ねて記事に記していこうと思います。
オプショナル型とは
オプショナル型とは、一言で言うと中身がnil(空)の状態を受け入れられる型のことです。
他のプログラミング言語では、空の値(swiftではnil)を参照しようとすると、アプリが落ちてしまいます。
しかしswiftでは、オプショナル型という存在のおかげでnilを許容することができます。
それによりnilが代入できるため、変数の値がnilであっても参照することができます。
オプショナル型のアンラップ
nilを許容するオプショナル型ですが、通常の非オプショナル型と同じように変数を扱うことはできません。
例えば、下記のコードを実行するとエラーが発生してしまいます。
var optionalValue: Int? = 1
opitionalValu + 2 //エラーが起きる
上記のコードでは、オプショナル形であるInt?に通常のInt型の値を代入しようとしているため、エラーが発生します。
この問題を解決するためには、オプショナル型に包まれた変数を取り出してあげる必要があります。
その方法をアンラップ(unwrap)といいます。
swiftではオプショナル型の中身の変数を包まれていると表現し、
包装を解いてあげるという意味でアンラップという言葉が用いられます。
そのアンラップの方法を4つ紹介していきます。
強制アンラップ
はじめに1番簡単なアンラップを紹介します。
下記のコードのように、変数に「!」をつける強制アンラップです。
let optionalInt: Int? = 1
let intValue: Int = optionalInt!
しかしこの方法は、万が一変数の中身がnilだった場合アプリが落ちてしまいます。
そのため、確実に中身がnilじゃないと判断できない場合には、違うアンラップ方法を使うことが推奨されます。
「if let~」を用いたアンラップ
if letは、変数の値がnilじゃない時だけ、その値を用いて処理を実行するといったアンラップ方法です。
let optionalInt: Int? = 1
if let unwrappedInt = optionalInt {
// unwrappedIntを使用して処理を実行
} else {
// optionalIntがnilの場合の処理
}
optionalIntがnilじゃない場合、変数unwrappedに代入されます。
このunwrappedを使用して、処理を実行することができます。
optionalIntがnilだった場合はelse文に書かれている処理が実行されます。
このように、変数の値が存在しない場合の処理もelseの中で記述できるため、
アプリが落ちることを避けつつ、安全にアンラップを行うことができます。
「guard let~」を用いたアンラップ
guard letは、変数の値がnilの場合にreturnが返され、処理が終了するといったアンラップ方法です。
func processValue(optionalValue: Int?) {
guard let unwrappedValue = optionalValue else {
// nil時の処理を書くことも可能
return // optionalValueがnilの場合、処理終了
}
// unwrappedValueを使用して処理を実行
}
if letよりもguard letの方がシンプルな記述になっていることが分かります。
一見、if letだと普通の分岐処理なのか、アンラップ処理なのか見分けにくいですが、
guard letは一瞬でアンラップ処理だと見分けられます。
さらに、nilを確認した定数や変数は、アンラップ処理後も使うことができるというメリットもあります。
nil結合演算子を用いたアンラップ
nil結合演算子「??」を使って、変数の値がnilである場合にデフォルト値を代入するアンラップ方法があります。
let optionalInt: Int? = nil
let intValue = optionalInt ?? 0 // optionalIntがnilの場合、0が代入される
このアンラップ方法は、optionalがnilの場合に代替えの値を用意してあげることで、
安全にアンラップできるといった仕組みになっています。
if letで、変数がnilの場合に代替えの値を用意するには、
else文の中に値を代入する必要があるため冗長なコードになってしまいます。
nil結合演算子を使うことで、この処理を簡潔に記述することができます。
まとめ
今回は4つのアンラップ処理について紹介しました。
自分の中での使い分け方をまとめると、
・nilの時に他の処理やエラーハンドリングをしたい場合は「if let」
・nilの時は処理を終了させ、nilチェックのみを行いたい場合は「guard let」
・nilの時に代替えの値を用意するのみの処理を行いたい場合は「nil結合演算子」
・変数がnilじゃないと断言できない場合は、強制アンラップは使わない
という認識です。
アンラップについて学習した当初は、どれも一緒のように見えてましたが、
自分がやりたい処理に応じた最適なアンラップ方法が用意されているため、上手に使い分けることが大切です。
最後まで読んでいただきありがとうございました。