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

19/03/03 17:00:52     19/04/08 09:46:45

if letって何?

Swiftにはオプショナル型と非オプショナル型があり、その違いはnilを許容するか、許容しないかです。

そして、オプショナル型でnilかどうかの判定に使えるのがif letとguard letです。

このページでは、if let、guard letのそれぞれの使い方と、その違いについて解説します。

if letで出来ること

if letは変数の中身がnilかどうかを判定し、それぞれの場合の処理を実装するコードです。

サンプルコードは以下です。

if let apple = food {
    //foodがnilでない場合はこちらの処理が実行される
} else {
    //foodがnilの場合こちらの処理が実行される
}

if letの後ろはサンプルなので適当ですが、nilでない場合にif文の方が実行され、逆にnilでなかった場合にelse文の方が実行されます。

ただし、これと同じことをif letなしで実装することも可能です。

if food != nil {
    let apple = food!
    //foodがnilでない場合はこちらの処理が実行される
} else {
    //foodがnilの場合こちらの処理が実行される
}

if letという表現を使用せずとも、普通のif文でnilかどうかを判定できます。ではなぜわざわざif letを使用するのかというと、アンラップのためです。下の方のif文では、if文のなかでアンラップする必要があり、そうしないとnilを許容した型のままになります。

if letを使用すれば自動的にアンラップされるので、そのためにif letが存在します。

guard letに出来ること

guard letに出来ることは基本的にif letと同じです。違う点があるとすれば、スコープを抜けるコードがないとエラーになるということです。具体的には以下のようになります。

guard 条件式 else {
    処理
    returnまたはbreakまたはthrow
}

処理を実行したら、何かしらのコードでguard文を抜けます。

次に、実際にguard文を使ったサンプルコードを紹介します。

func checkInt(num:Int) {
    guard num >= 0 else {
    print("マイナスです")
    return
    }
    print("プラスです")
}

checkInt(num:-10)
checkInt(num:10)

実行すると以下のようにコンソール出力されます。

マイナスです
プラスです

String型のサンプルコードは以下です。

func printMessage(message: String?) {
    guard let thisMessage = message else {
    print("nilです")
    return
    }
    print(thisMessage)
}

printMessage(message:"メッセージです")
printMessage(message:nil)

実行すると以下のようにコンソール出力されます。

メッセージです
nilです

guard文の方がif let文よりもコードがシンプルになる場合がありますが、大きな違いとしてはやはりスコープを抜けるための処理を書かなければならない点でしょう。

Swiftはいろいろと制約の多いプログラミング言語ですが、それはコードの安全性を高めてバグの発生確率を抑えるためです。

また条件を複数指定することも可能です。

func checkString(str: String?) {
    guard let thisStr = str, thisStr.characters.count >= 5 else {
    print("不正な引数です")
    return
    }
    print(thisStr)
}

checkString(str:"character")
checkString(str:"char")
checkString(str:nil)

上記のコードを実行すると以下のようにコンソール出力されます。

character
不正な引数です
不正な引数です

結局どっちを使えば良いのか

使い分けとしては、nilだった場合にそれ以上処理を進めたくないならguard letを使用し、逆にそのまま処理を継続するならif letを使用する、といった使い分けが一般的です。理由としては上で説明した通り、guard letは処理をbreakなどで終了させる必要があるからです。

if letのなかでbreakを書いても特に問題はないのですが、guard letの方がややコードがシンプルになるうえに処理を終了させないとエラーで知らせてくれるので、そちらの方が好まれます。

システムの仕様にもよりますが、nilだったら処理を終了するシステムは多いです。後継の処理を判定する際にフラグ等利用するケースは多いですが、たとえばnilだったら別のメソッドに飛ぶようなロジックはあまり好ましくありません。

それがだめだというわけではないのですが、意図せずnilになっている場合が考えられるので、処理の継続判定を行うならフラグを立てる等能動的に値を設定した方が良いでしょう。逆に、何も値が入っていないnilだったら処理終了というロジックは一般的です。

以上のことから、guard letの方が使用機会は多いかもしれません。nilかnilでないかで後継の処理を決めるのではなく、あらかじめ後継の処理ごとにフラグを設定しておき、nilだったらむしろ処理を中断するイメージです。

このようなロジックならif letを使用するとelse文と分けて書かなければならないため冗長で、guard letを使用した方がシンプルなコードになります。たとえばまったく同じ処理をguard letとif letでそれぞれ記述してみると、以下のようになります。

まずはguard letで実装した場合です。

let hoge: String? = nil //`hoge`の中身は`nil`
guard let fuga = hoge else { return } //`hoge`は`nil`なのでreturnされる
//`hoge`が`nil`ではなかった時の後続処理

次にif letで実装した場合です。

let hoge: String? = nil //`hoge`の中身は`nil`
if let fuga = hoge {
    //`hoge`が`nil`ではない場合の後継処理
} else {
    //`hoge`が`nil`の場合の後継処理
}

明らかにguard letの方がコードがシンプルです。特にnilの場合のreturn処理の書き方はコードをうまく使いこなしている感じがあります。ただし他のプログラミング言語に慣れている方はif文の方が直感的に理解しやすい気持ちはあるかもしれません。

if文とelse文で処理を分ける書き方は他のプログラミング言語でも一般に使われるものなので、パッと見でわかりやすいのはif文の方でしょう。しかしguard文の方もわかりにくいというほどではなく、少し慣れれば単純に使いやすい便利なコードです。

なので、どちらでも実装できる場合、つまりnilで処理終了する場合はguard letを使用するのがおすすめです。if letも普通のif文よりはアンラップのコードが少しシンプルにはなりますが、Swiftのnilを使いこなすのであればguard letがもっともメリットが大きいのではないでしょうか。

案件量が豊富なアルマサーチ

アルマサーチ

最後に、アルマサーチのご紹介!

アルマサーチはフリーランス向けに案件をご紹介することに特化したエージェントサービスです。豊富な案件量から、安定して継続的な案件のご紹介を実現しており、口コミから登録エンジニアが急増中です。

アルマサーチが選ばれる理由

  1. 豊富な案件量。週3〜4日の案件や在宅リモート案件も。
  2. 優秀なコンサルタント陣。
  3. 案件に参画後もしっかりサポート。

豊富な案件量

フリーランス向けに特化し、業界屈指の案件量を誇ります!週3〜4日の案件や、在宅リモート案件もありますし、その他あらゆる希望をしっかりお伝えください。最適な案件のご紹介をさせていただきます。

優秀なコンサルタント陣

技術に疎く、開発の希望を伝えても響かないエージェント・・・嫌ですよね。アルマサーチにはそのような者は一切おりません!さらに独立にまつわる税金や保険関係に詳しいスタッフが徹底的にサポートさせていただきます。

案件に参画後もしっかりサポート

常駐先が決まった瞬間に、一度も連絡が取れなくなるエージェント・・・いますよね?アルマサーチでは、そのようなことは一切ありません!常に電話やメールは即対応しますし、月に1度のランチミーティングなどから現場の状況を細かくヒアリングし、就業環境改善に尽力いたします。

相談する

▼Swift関連の記事一覧
1, 【Swiftのフリーランス案件情報付き】仕事やエンジニアの将来性・学習方法!
2, 繰り返し処理に使えるSwiftのfor文とfor-in文の便利な使い方まとめ
3, 条件分岐に便利なSwiftのSwitch文の使い方まとめ
4, アプリ開発でよく使うSwiftの4つの文法を解説します
5, Swiftのoptional型を使いこなすための7つのポイント
6, Swiftで文字列を扱うためのstring型の使い方
7, Swiftでの配列の宣言・初期化・代入・参照の方法まとめ
8, 実際の開発現場でのSwiftの変数・定数の使われ方を解説します
9,(この記事)Swiftでif let文を使って出来ることとguard letの使い分けに関して
10, 開発現場でよく使うSwiftのif文の条件分岐をまとめました
11, SwiftにおけるTupleの使い方とわかりやすく解説します
12, 初心者にオススメのSwiftのサンプルコードをまとめてみました
13, SwiftのString、Int、Doubleの型の変換方法をまとめました
14, 開発現場で役に立つSwiftのクロージャの使い方
15, Swiftでwhileを使って上手に繰り返し処理を行おう
16, Swiftで文字列の長さをチェックするのにlengthを使ってみよう
17, Swiftのdictionaryの使い方と初期化方法をまとめました
18, Swiftの値渡しと参照渡しに関するまとめ
19, Swiftで参照渡ししたい時のinoutの便利な使い方
20, Swiftでfor-in文でindexを使いたい時の方法まとめ
21, Swiftでのクラスとstruct(構造体)の使い分けを解説します

人気記事

編集部おすすめ記事

この記事を読んだ人はこんな記事を読んでいます

案件探しやフリーランスになるための相談する