7.

Swiftの繰り返し制御|for-in・while・repeat-whileと範囲演算子

編集
この記事の要点
  • Swift の繰り返しは for-in(範囲・配列・辞書)/ while(先頭判定)/ repeat-while(末尾判定)の 3 種類
  • 範囲演算子 1...10(閉区間)と 1..<10(半開区間)を使い分ける
  • 逆順は (1...10).reversed()、ステップ指定は stride(from:to:by:)
  • 配列はそのまま for v in array、インデックスも欲しいときは for (i, v) in array.enumerated()
  • break でループ離脱、continue で次のイテレーションへ。多重ループ脱出はラベル付き break

Swift の繰り返し構文一覧

Swift はモダンなループ構文を採用し、C 言語ライクな for (i=0;i<10;i++) 形式は Swift 3 で廃止されました。現代の Swift では for-inwhile / repeat-while の 3 形態だけ覚えれば十分です。

1. for-in と範囲演算子

もっとも基本的な書き方です。範囲演算子と組み合わせて回数指定ループを作ります。

// 閉区間(1, 2, 3, ..., 10)
for i in 1...10 {
    print(i)
}

// 半開区間(0, 1, 2, ..., 9)
for i in 0..<10 {
    print(i)
}

// インデックスを使わないなら _ で受ける
for _ in 1...5 {
    print("Hello")
}

2. 配列・辞書を回す

let array = ["aaa", "bbb", "ccc"]

// 値だけ
for v in array {
    print(v)
}

// インデックス付きで回す(enumerated)
for (i, v) in array.enumerated() {
    print("\(i): \(v)")
}

// 辞書はタプルで取れる
let dict = ["red": 1, "blue": 2, "green": 3]
for (key, value) in dict {
    print("\(key) = \(value)")
}

3. 逆順・ステップ指定

// 逆順(10, 9, ..., 1)
for i in (1...10).reversed() {
    print(i)
}

// 2 ずつ(0, 2, 4, 6, 8)
for i in stride(from: 0, to: 10, by: 2) {
    print(i)
}

// 末端を含めたいときは through
for i in stride(from: 0, through: 10, by: 2) {
    print(i) // 0, 2, 4, 6, 8, 10
}

// 浮動小数点も OK
for x in stride(from: 0.0, to: 1.0, by: 0.25) {
    print(x) // 0.0, 0.25, 0.5, 0.75
}

4. while と repeat-while

回数が事前に決まらないときに使います。while は先頭判定、repeat-while(他言語の do-while 相当)は末尾判定なので必ず 1 回は実行されます。

// while(先頭判定)
var n = 0
while n < 5 {
    print(n)
    n += 1
}

// repeat-while(末尾判定 = 最低 1 回実行)
var m = 10
repeat {
    print(m)
    m -= 1
} while m > 0

5. break と continue

for i in 1...10 {
    if i == 3 { continue }   // 3 をスキップ
    if i == 7 { break }      // 7 で終了
    print(i)                 // 1, 2, 4, 5, 6
}

多重ループからの脱出(ラベル付き break)

outer: for i in 1...3 {
    for j in 1...3 {
        if i == 2 && j == 2 {
            break outer   // 外側ループごと抜ける
        }
        print("\(i)-\(j)")
    }
}

6. forEach と for-in の違い

関数型風に書きたいときは Sequence の forEach も使えますが、forEach の中では break / continue / return(外側関数からの早期 return)が使えません。離脱が必要なら for-in を選びます。

[1, 2, 3].forEach { print($0) }   // OK
// [1, 2, 3].forEach { if $0 == 2 { break } }  // ❌ コンパイルエラー

7. where 句で条件絞り込み

for-in に where を付けると、条件を満たす要素だけ処理できます。if + continue を書く代わりに 1 行で済みます。

for i in 1...10 where i.isMultiple(of: 2) {
    print(i)  // 2, 4, 6, 8, 10
}

サンプル: 配列の中身を表示

// 基本的な繰り返し文
for i in 1...10 {
    print(i)
}

// 配列の中身を表示
var array = ["aaa", "bbb", "ccc"]
for val in array {
    print(val)
}

出力結果

1
2
3
4
5
6
7
8
9
10
aaa
bbb
ccc

まとめ

構文使いどころ
for i in 1...n回数が決まっている繰り返し
for v in arrayコレクションの全要素処理
for (i, v) in array.enumerated()インデックスも必要なとき
stride(from:to:by:)ステップ・小数・逆順を細かく制御
while条件が満たされる間続ける
repeat-while最低 1 回は実行したい
break / continue / ラベル途中離脱・スキップ・多重脱出

関連

  • Swift — 親カテゴリ
編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. print でデバッグ出力
  2. 変数の宣言
  3. 定数の宣言
  4. データ型
  5. 配列の宣言/追加/削除
  6. クラスとメソッドの作り方と呼び出し方
  7. 繰り返し制御
  8. if文による条件分岐
  9. エラー一覧

最近更新/作成されたページ