0Pricing
Swift Academy · レッスン

ネストしたループから抜ける

ラベルを使って複数階層のループから抜けます。

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

ネストしたループの問題

ネストしたループ内の通常の break は内側のループだけを終了し、外側のループは実行を続けます。

for i in 1...3 {
    for j in 1...3 {
        if j == 2 { break }
        print(i, j)
    }
}

ラベル付き break で解決する

外側のループにラベルを付け、break outer を使うと、両方のループを一度に終了できます。

outer: for i in 1...3 {
    for j in 1...3 {
        if i == 2 && j == 2 { break outer }
        print(i, j)
    }
}
print("escaped")

2D グリッドを検索する

ラベル付き break は、2D 検索で対象を見つけたらすぐに処理を停止するのに最適です。

let grid = [[1, 2, 3], [4, 5, 6]]
var position = (-1, -1)
find: for r in 0..<grid.count {
    for c in 0..<grid[r].count {
        if grid[r][c] == 5 {
            position = (r, c)
            break find
        }
    }
}
print(position)

ラベルを使わない場合:フラグ

ラベルを使わない方法としてブール値のフラグを使えますが、コードが長くなり、エラーも起きやすくなります。

var stop = false
for i in 1...3 {
    for j in 1...3 {
        if i + j == 4 { stop = true; break }
        print(i, j)
    }
    if stop { break }
}

ラベルのほうが簡潔

フラグと比べて、ラベル付き break は意図を直接表現でき、内側のループ後に追加のチェックを行う必要もありません。

outer: for i in 1...3 {
    for j in 1...3 {
        if i + j == 4 { break outer }
        print(i, j)
    }
}

3重のネスト

ラベルは3階層以上にも対応できます。終了したいループを対象にしてください。

top: for a in 1...2 {
    for b in 1...2 {
        for c in 1...2 {
            if c == 2 { break top }
            print(a, b, c)
        }
    }
}

ネスト内でのラベル付き continue

深くネストした場所から外側のループの次の反復へ移るには、continue label を使います。

rows: for r in 1...3 {
    for c in 1...3 {
        if c == 2 { continue rows }
        print(r, c)
    }
}

両方の組み合わせ

同じネスト構造内でラベル付き break と continue を組み合わせ、細かく制御できます。

scan: for i in 1...3 {
    for j in 1...3 {
        if j == 1 { continue }
        if i == 3 { break scan }
        print(i, j)
    }
}

早期終了によるパフォーマンス

答えが見つかった時点ですぐに終了すると、大きなデータセットで不要な反復を避けられます。

let data = Array(1...100)
var firstBig = -1
loop: for chunk in stride(from: 0, to: data.count, by: 10) {
    for k in chunk..<min(chunk + 10, data.count) {
        if data[k] > 25 {
            firstBig = data[k]
            break loop
        }
    }
}
print(firstBig)

関数から return する

関数内では、return もすべてのループを一度に終了する簡潔な方法です。

func findPair(_ target: Int) -> (Int, Int)? {
    for i in 1...5 {
        for j in 1...5 {
            if i * j == target { return (i, j) }
        }
    }
    return nil
}
print(findPair(12) ?? (-1, -1))

方法を選ぶ

ネストしたループの途中で終了する場合はラベル付き break を使い、関数内で処理全体を終了したい場合は return を使います。

outer: for x in 1...3 {
    for y in 1...3 {
        if x * y >= 4 { break outer }
        print(x, y)
    }
}

クイックチェック

ネストしたループの制御を確認しましょう。

まとめ

通常の break は最も内側のループだけを終了します。外側のループにラベルを付けて break label を使うと、すべての階層を一度に抜けられます。これはブール値のフラグよりも簡潔です。関数内では、return でもすべてを終了できます。

outer: for i in 1...3 {
    for j in 1...3 {
        if j == 2 { break outer }
        print(i, j)
    }
}

よくある質問

「ネストしたループから抜ける」レッスンは無料ですか?

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

「ネストしたループから抜ける」で何を学びますか?

ラベルを使って複数階層のループから抜けます。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「ネストしたループから抜ける」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

  1. breakとcontinueの基礎
  2. ラベル付き文
  3. ネストしたループから抜ける
  4. switchコンテキストでのループ制御
← Swift Academyに戻る