0Pricing
Swift Academy · レッスン

早期終了のためのguard let

失敗時に値をアンラップして早期終了し、ネストを減らします。

「早期終了のためのguard let」はCoddyKit上の無料Swift Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSwift Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Swift Academyコースには全4レッスンが含まれています。

guardの考え方

guardは条件を確認し、失敗した場合は現在のスコープを抜けます。正常系の処理を深くインデントせずに早期終了するための構文です。

func greet(_ name: String?) {
    guard let name else {
        print("No name")
        return
    }
    print("Hello, \(name)")
}
greet("Ada")
greet(nil)

guard letの構文

guard let value = optional else { return }と記述します。if letとは異なり、アンラップされた値はguardの後もスコープ内に残ります。

func double(_ text: String) {
    guard let n = Int(text) else {
        print("Not a number")
        return
    }
    print(n * 2)
}
double("8")
double("x")

値をそのまま使い続ける

guardは失敗時にスコープを抜けるため、その後は値が存在するとコンパイラが判断できます。関数の残りの部分では、通常どおり値を使えます。

func length(of text: String?) {
    guard let text else { return }
    let count = text.count
    print(count)
}
length("hello")

else はスコープを抜ける必要があります

guard の else ブロックでは、現在のスコープを抜ける必要があります。使用できるのは return、break、continue、または throw です。これはコンパイラーによって強制されます。

func process(_ value: Int?) {
    guard let value else {
        return
    }
    print("Processing \(value)")
}
process(99)

guard let の省略形

if let と同様に、guard も省略形をサポートしています。名前が一致する場合は、guard let name else { ... } と書けます。

func show(_ name: String?) {
    guard let name else {
        print("missing")
        return
    }
    print(name)
}
show("Kai")

平坦な正常系

guard の大きな利点は、正常系を平坦で読みやすくできることです。ネストした if let のピラミッド構造と、複数の guard を並べた場合を比較してみてください。

func register(name: String?, age: Int?) {
    guard let name else { return }
    guard let age else { return }
    print("\(name) is \(age)")
}
register(name: "Mia", age: 28)

単純な条件での guard

guard は、オプショナルだけでなく、任意の Bool 条件で使用できます。guard count > 0 else { return } と書くと、早い段階で処理を中断できます。

func divide(_ a: Int, by b: Int) {
    guard b != 0 else {
        print("Cannot divide by zero")
        return
    }
    print(a / b)
}
divide(10, by: 2)
divide(10, by: 0)

ループ内の guard

ループ内では、データが存在しない場合に guard で continue し、その反復をスキップできます。

let inputs = ["1", "x", "3"]
for item in inputs {
    guard let n = Int(item) else { continue }
    print(n * 10)
}

1つの guard で複数のバインディング

1つの guard で、カンマ区切りにより複数のオプショナルをアンラップできます。処理を続行するには、すべて成功する必要があります。

func combine(_ a: String?, _ b: String?) {
    guard let a, let b else { return }
    print(a + b)
}
combine("foo", "bar")

where に似たチェックを伴う guard

バインディングの後にカンマで Boolean 条件を追加すると、guard を通過する条件をさらに絞り込めます。

func validate(_ text: String?) {
    guard let text, !text.isEmpty else {
        print("invalid")
        return
    }
    print("ok: \(text)")
}
validate("")
validate("hi")

guard を選ぶタイミング

関数の先頭で前提条件を確認する場合は guard を使い、分岐内で短時間だけ値が必要な場合は if let を使います。

func area(width: Int?, height: Int?) -> Int {
    guard let width, let height else { return 0 }
    return width * height
}
print(area(width: 3, height: 4))

クイックチェック

guard let をテストします。

まとめ: 早期退出には guard let

guard let value else { return } はオプショナルをアンラップし、その後も値をスコープ内で使用できるようにします。else ブロックではスコープを抜ける必要があるため、正常系を平坦で読みやすく保てます。

func f(_ x: Int?) {
    guard let x else { return }
    print(x)
}
f(5)

よくある質問

「早期終了のためのguard let」レッスンは無料ですか?

はい。「早期終了のためのguard let」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Swift Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Swift Academyコースには全4レッスンが含まれています。

「早期終了のためのguard let」で何を学びますか?

失敗時に値をアンラップして早期終了し、ネストを減らします。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Swift Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSwift Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「早期終了のためのguard let」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSwift Academyレッスンでコードを書いて実行できますか?

はい。すべてのSwift Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. if letと省略形のバインディング
  2. 早期終了のためのguard let
  3. 複数のoptionalのバインディング
  4. switchとforでのoptionalパターン
← Swift Academyに戻る