8.

Swiftのif文の使い方|条件分岐とif let・guard letによるOptional処理

編集

Swiftのif文は、指定した条件が成り立つかどうかで実行する処理を切り替えるための条件分岐構文である。条件が真(true)のときだけ特定の処理を実行したり、真偽に応じて別々の処理へ枝分かれさせたりする場面で用いられる。

 

この記事の要点
  • if文は if 条件 { 処理 } の形で書き、条件を囲む丸括弧は不要だが、処理を囲む波括弧 { } は省略できない
  • 分岐を増やすときは else if、いずれにも当てはまらない場合は else を使う。
  • 条件に書ける式は Bool型(true/false)に限られる。整数やOptionalをそのまま条件にすることはできない。
  • Optional値を安全に取り出すには if letguard let(Optionalバインディング)を用いる。これはSwift特有の重要な書き方である。
  • 単純な値の代入なら三項演算子、値ごとの多分岐ならswitch文が読みやすい場合がある。

 

if文の基本構文

もっとも基本的なif文は、条件が true のときだけ波括弧内の処理を実行する。Swiftでは条件式を囲む丸括弧(( ))は書く必要がなく、代わりに処理を囲む波括弧({ })が必須である点が特徴的である。

let score = 80

if score >= 60 {

    print("合格")

}

条件 score >= 60 が成り立つため「合格」が出力される。条件が成り立たない場合に別の処理を行いたいときは、else を続ける。

let score = 50

if score >= 60 {

    print("合格")

} else {

    print("不合格")

}

このコードでは score が60未満なので、else 側の「不合格」が出力される。

 

else if による多段分岐

3通り以上に枝分かれさせたい場合は、else if を必要なだけ並べる。条件は上から順に評価され、最初に true になったブロックだけが実行される。それ以降の条件は評価されない。

let score = 85

if score >= 90 {

    print("優")

} else if score >= 70 {

    print("良")

} else {

    print("可")

}

score が85のとき、最初の score >= 90false、次の score >= 70true となるため「良」が出力される。条件の順序によって結果が変わるため、範囲の広い条件を後ろに書くなど並び順には注意が必要である。

 

条件に使う演算子

if文の条件には、値を比較する比較演算子と、複数の条件を組み合わせる論理演算子がよく使われる。いずれも結果はBool型になる。

演算子 種類 意味 例(trueになる場合)
== 比較 等しい a == b
!= 比較 等しくない a != b
< / > 比較 より小さい / より大きい a < b
<= / >= 比較 以下 / 以上 a >= b
&& 論理(AND) 両方が真なら真 a && b
|| 論理(OR) どちらかが真なら真 a || b
! 論理(NOT) 真偽を反転する !a

論理演算子を使うと、複数の条件をまとめて1つのif文で判定できる。

let age = 25

let hasTicket = true

if age >= 20 && hasTicket {

    print("入場できます")

}

上記では age >= 20hasTicket の両方が true のときだけ処理が実行される。&& は左側が false なら右側を評価しない短絡評価が行われる。

 

if let / guard let によるOptionalの処理

Swiftには、値が存在しないかもしれないことを表すOptional型がある。Optionalは nil(値なし)の可能性があるため、そのまま中身を使うことはできない。値が入っているかを確認しつつ、入っていれば安全に取り出す仕組みがOptionalバインディングであり、if文と組み合わせた if let がその代表である。

let input: String? = "42"

if let value = Int(input ?? "") {

    print("数値に変換できました: \(value)")

} else {

    print("変換に失敗しました")

}

if let value = ... は、右辺が nil でなければ中身を定数 value に取り出して if ブロックを実行し、nil なら else ブロックへ進む。value はブロック内では非Optionalとして扱えるため、安全に利用できる。

一方、guard let は「条件を満たさなければ早期に抜ける」ことを明示する書き方で、主に関数の冒頭で前提条件をチェックする際に使われる。取り出した値はその後のコードで継続して使えるのが特徴である。

func show(_ input: String?) {

    guard let name = input else {

        print("名前がありません")

        return

    }

    print("ようこそ \(name) さん")

}

guard letelse ブロックが必須で、その中では return などで処理を抜ける必要がある。if let が「取り出せたときの処理」を中心に書くのに対し、guard let は「取り出せなかったときに抜ける」処理を先に書き、本筋のコードのネストを浅く保てる利点がある。

 

三項演算子による簡潔な分岐

真偽に応じて2つの値のどちらかを選ぶだけの単純な分岐であれば、三項演算子 条件 ? 真のときの値 : 偽のときの値 を使うと1行で書ける。

let score = 80

let result = score >= 60 ? "合格" : "不合格"

print(result)  // 合格

同じ処理をif文でも書けるが、値の代入だけが目的なら三項演算子のほうが簡潔になる。ただし条件や分岐が複雑になる場合は、可読性の面でif文を選ぶほうが分かりやすいことが多い。

 

switch文との使い分け

if文は任意の条件式で分岐できるため、範囲の判定や複数条件の組み合わせに向いている。一方、1つの値が「どの値に一致するか」で多方向に分岐する場合は、switch 文のほうが見通しがよくなることがある。値のパターンが多いときや、列挙型(enum)の全ケースを扱うときには switch が適している場面が多い。条件の性質に応じて、読みやすいほうを選ぶとよい。

 

よくある落とし穴
  • 条件はBool型でなければならない。 多くのC系言語のように整数を条件に書くこと(例: if 1 { })はできず、コンパイルエラーになる。比較演算子などで明示的にBool型の式を書く必要がある。
  • Optionalを直接条件にできない。 String? などのOptional値を if value { } のように真偽判定することはできない。中身を確認したいときは if letguard let、あるいは value != nil のように明示的に比較する。
  • 波括弧 { } は省略できない。 処理が1行であっても波括弧で囲む必要がある。条件を囲む丸括弧は不要なので、丸括弧と波括弧の役割を取り違えないよう注意する。
  • 代入 = と比較 == の取り違えに注意。 条件で等価判定をしたいときは == を使う。= は代入であり、条件式としては成立しない。

 

よくある質問(FAQ)

Q. 条件式に丸括弧を付けてもよいですか。
A. if (score >= 60) { } のように丸括弧を付けても文法上は許容され、エラーにはならない。ただしSwiftでは丸括弧を付けないのが一般的な書き方であり、不要な括弧は省くスタイルが推奨されることが多い。

Q. if let と guard let はどちらを使えばよいですか。
A. 取り出した値をそのブロック内だけで使うなら if let、関数の前提条件を確認し、満たさなければ早期に抜けたうえで以降の処理で値を使い続けたいなら guard let が適している。guard let はネストが深くなりにくく、本筋のコードを読みやすく保てる利点がある。

Q. 複数のOptionalをまとめて取り出せますか。
A. if let a = optA, let b = optB { } のようにカンマで区切って複数のバインディングを並べられる。すべてが nil でない場合にのみブロックが実行される。さらに if let a = optA, a > 0 { } のように、取り出した値に対する追加条件を続けて書くこともできる。

編集
Post Share
子ページ

子ページはありません

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

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