【Swift】if let と guard let とは


はじめに

「if」と「if let」って何が違うのか、イマイチ理解していなかったので、調べてみました。

開発環境

Swift (Version 5.3.2)
Xcode (Version 12.4)
MacBook Air (13-inch, 2019)
macOS Big Sur (version 11.2.3)

if letとは

変数の中身がnilかどうかを判定し、nil用の処理とnilでは無い(値が入っている)時の処理とを分けることができます。

Swift
 variableがnilの場合

var variable: String?

if let nilTest = variable {
    print(nilTest)
} else {
    print("変数はnilです") // こっちが実行される
}
// 変数はnilです

------------------------------------------
 variableがnilで無い場合

var variable: String?
variable = "値"

if let nilTest = variable {
    print(nilTest) // こっちが実行される
} else {
    print("変数はnilです")
}
// 値

上記の例では...

① 変数「variable」がnilの場合
variableがnilなので、if let文がスキップされ、else文が実行されます。

② 変数「variable」がnilで無い場合
variableに「値」というString型の値が代入されたので、if let文が実行されます。
variableの値が、nilTestに代入され、今回の例ではそれをprint(nilTest)で出力しています。

guard letとは

変数の中身がnilかどうかを判定し、nilであればguard let以下の処理をスキップします。

Swift
 variableがnilの場合

var variable: String?

func nilTest() {
    guard let _ = variable else {
        print("変数はnilです") // こっちが実行される
        return
    }
    print(variable!)
}
nilTest() // 変数はnilです

---------------------------------------------
 variableがnilで無い場合

var variable: String?
variable = "値"

func nilTest() {
    guard let _ = variable else {
        print("変数はnilです")
        return
    }
    print(variable!) // こっちが実行される
}
nilTest() // 値

上記の例では...

① 変数「variable」がnilの場合
variableがnilなので、guard letが実行され、return文でguard let以下の処理は実行されません。

② 変数「variable」がnilで無い場合
variableに「値」というString型の値が代入されたので、guard let文はスキップされます。
強制アンラップされた変数variableをprint(variable!)という形で実行しています。

guard let文のおかげで、変数がnilで無いことが保証されているので、安全に強制アンラップを行うことができます。

使い分け

if let

if letは、値がnilだった時の処理が必要な場合に使用しましょう。

guard let

guard letは、値がnilの場合にguard let以下の処理をスキップしたい場合に使用しましょう。

おわりに

使用頻度が多い記述方法ですので、覚えておいて損は無いです。