2
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

暗黙的アンラップってなんだろう

Posted at

アプリ開発をしているとオプショナルバインディングとかオプショナルという言葉をよく聞くと思います。今回はそのアンラップ方法の一つで名前だけではよくわからない「暗黙的アンラップ(Implicity Unwrapped Optional)」について簡単にまとめたいと思います。

#アンラップの種類のおさらい
nilのアンラップは暗黙的アンラップを除いて3つあります。ここでは一つずつ簡単に説明したいと思います。

大前提として以下のように定義したオプショナル型の整数型(int)をアンラップしたいと思います。

var number: Int?
number = 1

###1, 強制アンラップ(Forced unwrapping)
簡単に言うと、オプショナルを使いたいときに後ろに!をつけます。

print(number!)

このアンラップの方法を使うとオプショナルがnilの場合クラッシュします。

###2, ??演算子(Nil Coalescing)
簡単に言うと、オプショナルを使いたいときに後ろに「?? 初期値」をつけます。

print(number ?? 0)

このアンラップの方法を使うとオプショナルがnilの場合は代わりに??の後に書いている初期値(今回の場合は0)を使います。

###2, if letでアンラップ
以下のように書きます。

if let n = number {
   //numberがnilではないときにnにnumberが代入される。
   print(n)
} else {
   //numberがnilのとき
}

これはnumberをnに代入できた時(すなわちnumberがnilではないとき)にifのカッコ内を実行するというコード。
利点はnilだった時の挙動を決めることができる。

###3, guard letでアンラップ

guard let n = number else { return }
print (number)

正直if letと違いはないのですがこれを使うとguard文以降でもアンラップした値を使えます。

#暗黙的アンラップとは?
さてここで本題の暗黙的アンラップについてです。暗黙的アンラップは変数を定義するところから違います。定義は以下のようにします。?の代わりに!をつけて定義します。

var number: Int! //初期値はnil
number = 1

これを使うと実際に値を使うときに!if letなどのアンラップをする必要がなくなります。

print(number)

一見すごく便利に見えますが一つ注意するべきことがあります。**これは中身がnilの場合はクラッシュしてしまします。**簡単に言うと暗黙的アンラップを使うと、使うたびに強制アンラップされます。

###暗黙的アンラップの利点
一見、強制アンラップと一緒でoptional型かわかりにくくしてしまい不便に見える暗黙的アンラップですがもちろん利点もあります。
これを使うと、初期値はないが後から必ず値を入れる保証があるものに使うと効果を発揮します。(例えば、ユーザーが前のviewで入力した値など)
所詮!をつけるだけと思うかもしれませんが、つけ忘れる心配が無くなるのはかなり大きな利点だと思います。

#まとめ
アンラップの方法はいくつかありますがそれぞれ特徴があるのでその特徴によって使うオプショナルバインディングの種類を変えるとより質の高いコードを書けるのではないでしょうか?この記事が皆さんのコーディングライフを豊かにするきっかけになっていたら嬉しいです。

2
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?