【Swift入門 #15】条件に基づく繰り返し - whileループとrepeat-while

条件が満たされている間だけ処理を繰り返すwhileループと、必ず1回は実行されるrepeat-whileループについて初心者向けに解説します。

📚 Swift入門シリーズ: #13 if文#14 switch文


前回はswitch文による複数の選択肢の扱い方を学びました。今回は、条件に基づいた繰り返し処理について学びましょう。

著者
著者: Sera
大学院でAI作曲に関して研究中!
来春からデータサイエンティストとして働く予定の技術オタク。
初心者
登場人物: あかり
流行りのAIやWeb技術に興味津々!
『知りたい』気持ちで質問を止められない、好奇心旺盛な学生。
normalの表情
初心者

前回はswitch文で複数の選択肢を扱う方法を学んだね!

専門家

そうだね。今回は、条件に基づいた繰り返し処理について学んでいくよ。

confusedの表情
初心者

繰り返し処理って、前にfor-inループで学んだよね?whileって何が違うの?

専門家

いい質問だね。for-inループは 回数が決まっている繰り返し に向いていて、whileループは 条件が満たされている間だけ繰り返す 場合に向いているんだ。

normalの表情
初心者

なるほど。具体的にどう違うの?

専門家

例えば、「配列の要素を全部表示する」のようにループ回数が決まっているならfor-inが適しているんだ。でも、「ユーザーが正しい値を入力するまで繰り返す」とか「値が10未満の間だけ繰り返す」みたいに、いつ終わるか分からない 場合はwhileが向いているんだよ。

whileループの基本

専門家

whileループ の基本的な書き方はこうなるよ。

while 条件 {
    // 条件がtrueの間、繰り返し実行される処理
}

条件がtrueの間、波括弧 {} の中の処理が繰り返し実行されるんだ。

基本的なwhileループ

専門家

実際の例を見てみよう。

var count = 1

while count <= 5 {
    print("カウント: \(count)")
    count += 1
}
// カウント: 1
// カウント: 2
// カウント: 3
// カウント: 4
// カウント: 5

count <= 5 という条件がtrueの間、処理が繰り返されるんだ。count が6になった時点で条件がfalseになり、ループが終了するんだよ。

normalの表情
初心者

ループの中で count += 1 って書いてあるね。これを忘れたらどうなるの?

専門家

とても重要な質問だね!もし count += 1 を忘れると、無限ループ になってしまうんだ。

var count = 1

while count <= 5 {
    print("カウント: \(count)")
    // count += 1 を忘れた!
}
// カウント: 1
// カウント: 1
// カウント: 1
// ... 永遠に繰り返される

count の値が変わらないから、条件が永遠にtrueのままで、ループが終わらなくなってしまうんだ。これは 初心者がよくやるミス だから、注意が必要なんだよ。

surprisedの表情
初心者

怖い!ループの中で条件を変える処理を忘れないようにしないと!

whileループでの配列処理

専門家

whileループで配列を処理する例も見てみよう。

let fruits = ["りんご", "バナナ", "オレンジ"]
var index = 0

while index < fruits.count {
    print("\(index + 1)番目: \(fruits[index])")
    index += 1
}
// 1番目: りんご
// 2番目: バナナ
// 3番目: オレンジ

index < fruits.count という条件で、配列の要素数だけループするんだ。

confusedの表情
初心者

でも、配列を処理するならfor-inループの方が簡単じゃない?

専門家

その通り!配列の全要素を処理するだけなら、for-inループの方が簡潔で安全なんだ。

// for-inの方が簡潔
let fruits = ["りんご", "バナナ", "オレンジ"]

for (index, fruit) in fruits.enumerated() {
    print("\(index + 1)番目: \(fruit)")
}

whileループは、もっと複雑な条件で処理を止めたい ときに使うんだよ。例えば、「特定の値が見つかったら処理を止める」みたいな場合だね。

for文とwhile文の使い分け

専門家

for文とwhile文の使い分けについて整理しておこう。

for-inループが向いている場合:

  • 配列やコレクションの全要素を処理したい
  • 決まった回数だけ繰り返したい
  • 範囲を使った繰り返し(1から10まで、など)

whileループが向いている場合:

  • 条件が満たされている間だけ繰り返したい
  • 繰り返し回数が事前に分からない
  • 複雑な終了条件がある
// for-inが向いている例
for i in 1...10 {
    print(i)
}

// whileが向いている例
var userInput = ""
while userInput != "quit" {
    print("コマンドを入力してください(quit で終了)")
    // userInput = readLine() ?? ""
    break  // 実際はユーザー入力を待つ
}
happyの表情
初心者

なるほど!それぞれに得意な場面があるんだね!

repeat-whileループ

confusedの表情
初心者

さっき「repeat-while」って言葉が出てきたけど、whileと何が違うの?

専門家

repeat-whileループ は、必ず最低1回は処理を実行する ループなんだ。

repeat {
    // 処理(最低1回は必ず実行される)
} while 条件

whileループとの違いを見てみよう。

whileループ:

var count = 10

while count < 5 {
    print("これは表示されない")
    count += 1
}
// 何も表示されない(条件が最初からfalse)

repeat-whileループ:

var count = 10

repeat {
    print("カウント: \(count)")
    count += 1
} while count < 5
// カウント: 10
// 1回だけ表示される

repeat-whileでは、条件チェックが 処理の後 に行われるから、最低1回は必ず実行されるんだよ。

normalの表情
初心者

へー!どういうときに使うの?

専門家

「最低1回は実行したい」 という場面で使うんだ。典型的な例は、ユーザー入力の検証だね。

var userAge = 0

repeat {
    print("年齢を入力してください")
    // userAge = Int(readLine() ?? "") ?? 0
    userAge = 25  // 実際はユーザー入力
} while userAge < 1 || userAge > 120

print("入力された年齢: \(userAge)")

この例では、少なくとも1回は入力を求めて、入力が有効な範囲(1〜120歳)になるまで繰り返すんだ。

break:ループを抜ける

専門家

ループを途中で抜けたいときは、break文 を使うんだ。

var count = 1

while count <= 10 {
    if count == 5 {
        print("5に到達したので終了")
        break
    }
    print("カウント: \(count)")
    count += 1
}
print("ループ終了")
// カウント: 1
// カウント: 2
// カウント: 3
// カウント: 4
// 5に到達したので終了
// ループ終了

break を実行すると、その時点でループを抜けて、ループの後の処理に移るんだよ。

excitedの表情
初心者

これは便利!特定の条件でループを止められるんだね!

専門家

実際の使用例を見てみよう。

let numbers = [3, 7, 2, 9, 4, 8, 1]
var target = 9
var index = 0
var found = false

while index < numbers.count {
    if numbers[index] == target {
        print("\(target)は\(index)番目に見つかりました")
        found = true
        break
    }
    index += 1
}

if !found {
    print("\(target)は見つかりませんでした")
}
// 9は3番目に見つかりました

目的の値が見つかったら、それ以上探す必要はないから、breakでループを抜けるんだ。

continue:次の繰り返しへ

専門家

continue文 を使うと、現在の繰り返しをスキップして、次の繰り返しに進めるんだ。

var count = 0

while count < 10 {
    count += 1

    if count % 2 == 0 {
        continue  // 偶数の場合はスキップ
    }

    print("奇数: \(count)")
}
// 奇数: 1
// 奇数: 3
// 奇数: 5
// 奇数: 7
// 奇数: 9

continue を実行すると、その後の処理をスキップして、次のループの先頭に戻るんだよ。

normalの表情
初心者

breakとcontinueの違いは何?

専門家
  • break: ループ全体を終了して、ループの外に出る
  • continue: 現在の繰り返しだけスキップして、次の繰り返しに進む

図で表すとこうなるんだ。

var count = 0

while count < 5 {
    count += 1

    if count == 2 {
        print("continueします")
        continue  // 3に進む
    }

    if count == 4 {
        print("breakします")
        break  // ループを抜ける
    }

    print("カウント: \(count)")
}
print("ループ終了")
// カウント: 1
// continueします
// カウント: 3
// breakします
// ループ終了

count=2のときはcontinueで処理をスキップし、count=4のときはbreakでループ全体を終了しているんだよ。

ネストしたループ

専門家

ループの中にループを書くこともできるんだ。これを ネストしたループ って言うんだよ。

var i = 1

while i <= 3 {
    var j = 1

    while j <= 3 {
        print("(\(i), \(j))")
        j += 1
    }

    i += 1
}
// (1, 1)
// (1, 2)
// (1, 3)
// (2, 1)
// (2, 2)
// (2, 3)
// (3, 1)
// (3, 2)
// (3, 3)

外側のループが1回まわるごとに、内側のループが全部実行されるんだ。

confusedの表情
初心者

ネストしたループでbreakを使ったら、どっちのループを抜けるの?

専門家

いい質問だね。breakは 一番内側のループだけ を抜けるんだ。

var i = 1

while i <= 3 {
    var j = 1

    while j <= 5 {
        if j == 3 {
            print("内側のループをbreak")
            break  // 内側のループだけ抜ける
        }
        print("(\(i), \(j))")
        j += 1
    }

    i += 1
}
// (1, 1)
// (1, 2)
// 内側のループをbreak
// (2, 1)
// (2, 2)
// 内側のループをbreak
// (3, 1)
// (3, 2)
// 内側のループをbreak

外側のループも抜けたい場合は、ラベル付きbreak を使うんだ。

outerLoop: while i <= 3 {
    var j = 1

    while j <= 5 {
        if i == 2 && j == 2 {
            print("外側のループもbreak")
            break outerLoop  // 外側のループも抜ける
        }
        print("(\(i), \(j))")
        j += 1
    }

    i += 1
}
print("ループ終了")

ラベル名: でラベルを付けて、break ラベル名 で指定したループを抜けられるんだよ。

実践練習

専門家

じゃあ、練習問題をやってみよう。

問題1: 1から100までの数を順に足していって、合計が1000を超えたら処理を止めるプログラムを書いてみて。何番目の数で1000を超えるかも表示してね。

excitedの表情
初心者

やってみる!

var sum = 0
var number = 1

while sum <= 1000 {
    sum += number
    number += 1
}

print("合計: \(sum)")
print("\(number - 1)番目の数で1000を超えました")

できた!

専門家

惜しい!でもちょっと問題があるんだ。このコードだと、合計が1000を 超えてから ループを抜けることになるよね。問題は「1000を超えたら止める」だから、1000を超える前にチェックする必要があるんだ。

var sum = 0
var number = 1

while true {
    if sum + number > 1000 {
        break
    }
    sum += number
    number += 1
}

print("合計: \(sum)")
print("\(number)を足すと1000を超えます")

あるいは、条件を工夫する方法もあるよ。

var sum = 0
var number = 0

while sum + (number + 1) <= 1000 {
    number += 1
    sum += number
}

print("合計: \(sum)")
print("\(number + 1)を足すと1000を超えます")
happyの表情
初心者

なるほど!条件の書き方が大事なんだね!

専門家

その通り!

問題2: repeat-whileを使って、10から1までカウントダウンするプログラムを書いてみて。

normalの表情
初心者
var count = 10

repeat {
    print(count)
    count -= 1
} while count >= 1

こう?

専門家

完璧だね!repeat-whileを正しく使えているよ。whileループでも書けるけど、この場合はどちらでも同じ結果になるね。

// whileループでも同じ結果
var count = 10

while count >= 1 {
    print(count)
    count -= 1
}

この場合は、最初から条件がtrueだから、どちらを使っても同じなんだ。でも、repeat-whileは「最低1回は実行したい」という意図が明確だから、そういう場合はrepeat-whileを使う方が分かりやすいんだよ。

まとめ

この記事では、whileループとrepeat-whileループについて学びました。

whileループ:

  • while 条件 { 処理 }
  • 条件がtrueの間、繰り返し実行
  • 条件が最初からfalseなら1回も実行されない

repeat-whileループ:

  • repeat { 処理 } while 条件
  • 必ず最低1回は実行される
  • 条件チェックが処理の後

ループ制御:

  • break:ループを抜ける
  • continue:次の繰り返しへ進む
  • ラベル付きbreak:外側のループも抜けられる

for文とwhile文の使い分け:

  • 回数が決まっている → for-in
  • 条件に基づく → while
  • 最低1回は実行したい → repeat-while

注意点:

  • 無限ループに注意(必ず条件を変える処理を入れる)
  • ネストしたループでのbreakは内側のループだけ

次回は「早期リターン」として、guard文について学びます。コードをより安全で読みやすくする方法を身につけましょう!

← ブログ一覧に戻る