📚 Swift入門シリーズ: #11 セットSet → #12 for-inループ
プログラムでは、条件によって処理を変えたい場面が頻繁にあります。この記事では、if文を使った条件分岐について学びましょう。
来春からデータサイエンティストとして働く予定の技術オタク。
『知りたい』気持ちで質問を止められない、好奇心旺盛な学生。
前回はfor-inループで反復処理を学んだね!
そうだね。今回からは、プログラムの流れを制御する方法を学んでいくよ。第4章の始まりだね。
これまでで、データ型とコレクション、そしてループ処理を学んできたね。プログラムの基礎が身についた感じ!
よく頑張ったね。今回からは、プログラムの流れを制御する方法を学んでいくよ。
これまでのプログラムって、上から順番に実行されるだけだよね。「もし〇〇なら△△する」みたいな処理はできないの?
それこそが今日学ぶ 条件分岐 なんだ。if文 を使えば、「もし条件が満たされたら、この処理を実行する」というプログラムが書けるんだよ。
それは便利そう!
if文の基本
if文 の基本的な書き方はこうなるよ。
if 条件 {
// 条件がtrueのときに実行される処理
}
条件がtrueの場合だけ、波括弧 {} の中の処理が実行されるんだ。
基本的なif文
実際の例を見てみよう。
let age = 20
if age >= 18 {
print("成人です")
}
// 成人です
age >= 18 という条件がtrueだから、「成人です」と表示されるんだ。
もし条件がfalseなら、何も実行されないよ。
let age = 15
if age >= 18 {
print("成人です")
}
// 何も表示されない
条件がfalseのときは、何も起きないんだね。
そうなんだ。でも、「条件がfalseのときの処理」も書きたいことがあるよね。そのときは else を使うんだ。
else:条件が偽の場合
else を使えば、条件がfalseのときの処理を書けるんだ。
if 条件 {
// 条件がtrueのときの処理
} else {
// 条件がfalseのときの処理
}
実際の例を見てみよう。
let age = 15
if age >= 18 {
print("成人です")
} else {
print("未成年です")
}
// 未成年です
age >= 18 がfalseだから、elseの中の処理が実行されるんだよ。
これで、どちらの場合でも何か処理ができるね!
else if:複数の条件
3つ以上の選択肢がある場合はどうするの?例えば、「子供」「大人」「高齢者」みたいに分けたいとき。
そういう場合は else if を使うんだ。複数の条件を順番にチェックできるんだよ。
if 条件1 {
// 条件1がtrueのときの処理
} else if 条件2 {
// 条件1がfalseで、条件2がtrueのときの処理
} else {
// どの条件もfalseのときの処理
}
実際の例を見てみよう。
let age = 25
if age < 18 {
print("未成年です")
} else if age < 65 {
print("成人です")
} else {
print("高齢者です")
}
// 成人です
条件は上から順番にチェックされるんだ。最初に真になった条件のブロックだけが実行されて、それ以降の条件はチェックされないんだよ。
順番が大事なんだね。最初に当てはまったものが実行されるってことか。
その通り!だから、条件の順序はとても重要なんだ。
let score = 85
// 正しい順序
if score >= 90 {
print("A")
} else if score >= 80 {
print("B")
} else if score >= 70 {
print("C")
} else {
print("D")
}
// B
// 間違った順序
if score >= 70 {
print("C") // これが実行されてしまう
} else if score >= 80 {
print("B") // ここには到達しない
} else if score >= 90 {
print("A")
}
// C
最初の例では正しく「B」と判定されるけど、2番目の例では「C」と判定されてしまうんだ。条件は上から順にチェックされるから、より厳しい条件を先に書く必要があるんだよ。
順番を間違えると、全然違う結果になっちゃうんだね!
複数の条件を組み合わせる
これまで学んだ論理演算子を使えば、複数の条件を組み合わせられるんだ。
AND演算子(&&)
AND演算子(&&) を使えば、「AかつB」という条件が書けるんだ。
let age = 25
let hasLicense = true
if age >= 18 && hasLicense {
print("車を運転できます")
} else {
print("車を運転できません")
}
// 車を運転できます
両方の条件がtrueの場合だけ、「車を運転できます」と表示されるんだよ。
OR演算子(||)
OR演算子(||) を使えば、「AまたはB」という条件が書けるんだ。
let isWeekend = false
let isHoliday = true
if isWeekend || isHoliday {
print("休日です")
} else {
print("平日です")
}
// 休日です
どちらか一方でもtrueなら、「休日です」と表示されるんだよ。
NOT演算子(!)
NOT演算子(!) を使えば、条件を反転できるんだ。
let isRaining = false
if !isRaining {
print("傘は不要です")
}
// 傘は不要です
!isRaining は「雨が降っていない」という意味になるんだよ。
複雑な条件の組み合わせ
複数の論理演算子を組み合わせることもできるんだ。
let age = 25
let hasTicket = true
let hasMembership = false
if (age >= 18 && hasTicket) || hasMembership {
print("入場できます")
} else {
print("入場できません")
}
// 入場できます
「18歳以上でチケットを持っている」または「会員である」という条件なんだ。括弧を使って優先順位を明確にしているよ。
括弧を使わないとどうなるの?
論理演算子には優先順位があって、! → && → || の順で評価されるんだ。でも、可読性のためにも、括弧を使って明示的に書く方が良いんだよ。
// 括弧なし(読みにくい)
if age >= 18 && hasTicket || hasMembership {
print("入場できます")
}
// 括弧あり(読みやすい)
if (age >= 18 && hasTicket) || hasMembership {
print("入場できます")
}
三項条件演算子
前に三項条件演算子っていうのがちょっと出てきたけど、あれって何だったっけ?
三項条件演算子 は、if-elseを短く書ける便利な構文なんだ。
条件 ? 真の場合の値 : 偽の場合の値
実際の例を見てみよう。
let age = 20
let status = age >= 18 ? "成人" : "未成年"
print(status) // 成人
これは、次のif-elseと同じ意味なんだ。
let age = 20
var status: String
if age >= 18 {
status = "成人"
} else {
status = "未成年"
}
print(status) // 成人
三項条件演算子の方が短く書けるよね。
確かに短い!でも読みにくくならない?
いい指摘だね。三項条件演算子は短く書けるけど、複雑な条件だと読みにくくなることがあるんだ。だから、シンプルな条件分岐のときだけ使う のがおすすめだよ。
// 良い例:シンプルな条件
let message = isLoggedIn ? "ようこそ" : "ログインしてください"
// 悪い例:複雑すぎる
let result = score >= 90 ? "A" : score >= 80 ? "B" : score >= 70 ? "C" : "D"
悪い例のように、三項条件演算子をネストすると非常に読みにくくなるから、こういう場合は普通のif-elseを使うべきなんだ。
オプショナルバインディング
if文は、オプショナル型の値を安全に取り出すときにも使われるんだ。これを オプショナルバインディング って言うんだよ。
let numberString = "123"
let number = Int(numberString)
if let unwrappedNumber = number {
print("数値は\(unwrappedNumber)です")
} else {
print("数値に変換できませんでした")
}
// 数値は123です
if let 変数名 = オプショナル値 という構文で、値が存在する場合だけ処理を実行できるんだ。
普通のif文と何が違うの?
オプショナルバインディングは、値の存在確認とアンラップ(取り出し)を同時に行えるんだ。
let numberString = "abc"
let number = Int(numberString)
// 普通のif文
if number != nil {
print("数値は\(number!)です") // 強制アンラップが必要
}
// オプショナルバインディング
if let unwrappedNumber = number {
print("数値は\(unwrappedNumber)です") // 安全に使える
} else {
print("数値に変換できませんでした") // こちらが実行される
}
オプショナルバインディングの方が安全で、! を使った強制アンラップを避けられるんだよ。オプショナル型については第6章で詳しく学ぶから、今は「こういう書き方がある」って覚えておいてもらえれば大丈夫だよ。
実践練習
じゃあ、練習問題をやってみよう。
問題1: 点数(score)を変数で定義して、90点以上なら「優」、80点以上なら「良」、70点以上なら「可」、それ以外は「不可」と表示するプログラムを書いてみて。
やってみる!
let score = 85
if score >= 90 {
print("優")
} else if score >= 80 {
print("良")
} else if score >= 70 {
print("可")
} else {
print("不可")
}
できた!
完璧だね!条件の順序も正しいよ。
問題2: 年齢(age)とチケットの有無(hasTicket)を使って、「12歳未満は無料、チケットがあれば入場可、なければ入場不可」というロジックを書いてみて。
えーと...
let age = 10
let hasTicket = false
if age < 12 {
print("無料で入場できます")
} else if hasTicket {
print("入場できます")
} else {
print("入場できません")
}
こう?
素晴らしい!完璧だよ。else ifで順番に条件をチェックしているね。if文の使い方をしっかり理解できているよ。
まとめ
この記事では、if文による条件分岐について学びました。
if文の基本:
if 条件 { 処理 }:条件がtrueのときだけ実行else { 処理 }:条件がfalseのときに実行else if 条件 { 処理 }:複数の条件を順番にチェック
論理演算子:
&&(AND):両方の条件がtrue||(OR):どちらかの条件がtrue!(NOT):条件を反転
三項条件演算子:
条件 ? 真の値 : 偽の値- シンプルな条件分岐を短く書ける
- 複雑な場合は通常のif-elseを使う
オプショナルバインディング:
if let 変数 = オプショナル値- 値の存在確認とアンラップを同時に行う
重要なポイント:
- 条件は上から順にチェックされる
- 最初に真になった条件のブロックだけが実行される
- 括弧で優先順位を明確にする
次回は「複数の選択肢」として、switch文について学びます。より強力なパターンマッチングの方法を身につけましょう!