📚 Swift入門シリーズ: #13 if文 → #14 switch文
前回はswitch文による複数の選択肢の扱い方を学びました。今回は、条件に基づいた繰り返し処理について学びましょう。
来春からデータサイエンティストとして働く予定の技術オタク。
『知りたい』気持ちで質問を止められない、好奇心旺盛な学生。
前回はswitch文で複数の選択肢を扱う方法を学んだね!
そうだね。今回は、条件に基づいた繰り返し処理について学んでいくよ。
繰り返し処理って、前にfor-inループで学んだよね?whileって何が違うの?
いい質問だね。for-inループは 回数が決まっている繰り返し に向いていて、whileループは 条件が満たされている間だけ繰り返す 場合に向いているんだ。
なるほど。具体的にどう違うの?
例えば、「配列の要素を全部表示する」のようにループ回数が決まっているなら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になり、ループが終了するんだよ。
ループの中で count += 1 って書いてあるね。これを忘れたらどうなるの?
とても重要な質問だね!もし count += 1 を忘れると、無限ループ になってしまうんだ。
var count = 1
while count <= 5 {
print("カウント: \(count)")
// count += 1 を忘れた!
}
// カウント: 1
// カウント: 1
// カウント: 1
// ... 永遠に繰り返される
count の値が変わらないから、条件が永遠にtrueのままで、ループが終わらなくなってしまうんだ。これは 初心者がよくやるミス だから、注意が必要なんだよ。
怖い!ループの中で条件を変える処理を忘れないようにしないと!
whileループでの配列処理
whileループで配列を処理する例も見てみよう。
let fruits = ["りんご", "バナナ", "オレンジ"]
var index = 0
while index < fruits.count {
print("\(index + 1)番目: \(fruits[index])")
index += 1
}
// 1番目: りんご
// 2番目: バナナ
// 3番目: オレンジ
index < fruits.count という条件で、配列の要素数だけループするんだ。
でも、配列を処理するなら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 // 実際はユーザー入力を待つ
}
なるほど!それぞれに得意な場面があるんだね!
repeat-whileループ
さっき「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回は必ず実行されるんだよ。
へー!どういうときに使うの?
「最低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 を実行すると、その時点でループを抜けて、ループの後の処理に移るんだよ。
これは便利!特定の条件でループを止められるんだね!
実際の使用例を見てみよう。
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 を実行すると、その後の処理をスキップして、次のループの先頭に戻るんだよ。
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回まわるごとに、内側のループが全部実行されるんだ。
ネストしたループで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を超えるかも表示してね。
やってみる!
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を超えます")
なるほど!条件の書き方が大事なんだね!
その通り!
問題2: repeat-whileを使って、10から1までカウントダウンするプログラムを書いてみて。
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文について学びます。コードをより安全で読みやすくする方法を身につけましょう!