【Swift】安全にアンラップするために 〜!(強制アンラップ)とif letとguard letと??(Nil coalescing operator)の使い分け〜

Advent Calendar 2021, iOS, Swift

この記事は最終更新日から1年以上が経過しています。

1. はじめに

この記事はレコチョク Advent Calendar 2021の21日目の記事となります。

株式会社レコチョクで、iOSアプリの開発をしている新卒1年目の後藤です。
米津玄師・スキマスイッチ・BUMP OF CHICKENのみなさんに、日々活力を頂いております。

Swiftにはオプショナル型という nilを許容した型があります。これを非オプショナル型の値として取り出すためには、アンラップという作業が必要です。

この記事では

  • !(強制アンラップ)
  • if let
  • guard let
  • ??(Nil coalescing operator)

を使ってどのようにアンラップするか、どう使い分けるかを中心にまとめます。

2. オプショナル型とは

Swiftでは通常のデータ型(Int型やString型など)には、 nilを代入することができません。
そこで、オプショナル型を使うと変数に nilを代入することができるようになります。

3. !での強制アンラップ

オプショナル型の変数の値を、非オプショナル型の値として取り出す(上記の例でいうと hogeString?型を String型にする)ためには、アンラップという作業が必要です。

変数名!と書くと、強制的にアンラップすることができます。しかし、アンラップした変数が nilであった場合、実行時エラーが発生してしまいます。

そのため、オプショナル型の変数が nilでないことが保証できる場合のみ使用しましょう。

4. オプショナルバインディング(if let・guard let)でのアンラップ

上記の例のように 変数名!でアンラップすると、 nilであった場合、実行時エラーが発生してしまいます。

そこで、安全にアンラップする方法の一つとして、オプショナルバインディングがあります。オプショナルバインディングを使うことで、 nilであるかを確認して処理を進めることができます。

オプショナルバインディングは、2つの構文が存在します。

  • if let
  • guard let

if let

if let文は、オプショナル型変数に nilが含まれているかどうかによって、後続の処理を分岐させることができます。

guard let

guard let文は、オプショナル型変数に nilが含まれている場合、その時点で処理を中断させることができます。

下記のコードでは hogenilのため、else節で returnされ、早期リターンします。また、if let文と比べて、後続の処理(コード)のネストを浅くすることができ、コードが読みやすくなります。

なお、guard let文は、関数の中でしか実行することができないため注意が必要です。

両方に共通すること

if let文も guard let文も、条件を nil以外にも指定することができます。例えば下記の例だと、 hogenilではないかつ、 Aという値を持っていたらprint文が実行されます。

また、複数の変数を同時に、 nilが入っているのかを確認することもできます。

5. ??(Nil coalescing operator)でのアンラップ

Nil coalescing operatorでも、オプショナル型の変数が nilなのかを確かめることができます。

Nil coalescing operatorは nilだった場合、予め用意しておいた値を代入します。そのため、先ほど紹介したif let文やguard let文とは異なり nilだったときの処理を条件分岐させて書くことができません。

Nil coalescing operatorは、 nilだったときのデフォルト値が想定されている場合で使用すると良いです。例えば下記の例では、楽曲アプリを作成していてタイトルやアーティストの情報が取得できなかったら、予め用意しておいたデフォルト値を入れています。

6. まとめ

本記事では、オプショナル型の変数に格納された値を取り出す(アンラップする)ための方法として、4通りの方法を紹介しました。

  • !(強制アンラップ)
    • nilの場合で、実行時エラーが発生してしまう
    • nilでないことが保証できる場合のみ使用する
  • if let
    • nilの場合で、行いたい処理がある場合に使用する
  • guard let
    • nilの場合で、それ以上処理を進めたくない場合に使用する(早期リターンできる)
    • 関数の中でしか使うことができない
  • ?? (Nil coalescing operator)
    • nilの場合で、デフォルト値を設定できる場合に使用する
    • nilの場合で、条件分岐をさせることができない

最後まで読んでいただき、ありがとうございました。

明日のレコチョク Advent Calendar 2021は22日目「MediaElement.jsでメディアプレイヤーのUIをサクッとつくる」となります!お楽しみに。

参考記事

【初心者向け】Swiftの”?”と”!”,はじめからていねいに (1/2)

【初心者向け】Swiftの”?”と”!”,はじめからていねいに (2/2)

2.1.12. オプショナル | 基本 | Swift

guard letとif letの使い分け

【Swift】guard文、guard let文の使い方/ if letとの違いも

Swiftでif let文を使って出来ることとguard letの使い分けに関して

新卒iOSエンジニアがコードレビューを受けて気づいたポイント4選