Swift 文法その4 - 分岐処理 -

一見難しそうに見えるプログラミングも、処理の仕方は3つしかありません。上から順番に処理する順次実行、条件によって処理を分ける分岐処理、同じ処理を繰り返し実行するループ処理です。ここでは Swift の分岐処理についてご紹介します。

if guard 、switch のいずれかを用いて書くことができます。

if

「もし...であれば処理を実行する」という分岐処理の最も基本的な書き方です。

if 条件式 {
    ...
}
if 条件式 {
    ...
} else {
    ...
}
if 条件式 {
    ...
} else if 条件式 {
    ...
} else {
    ...
}

また、if 文は nil チェックに使用したり、Optional Binding した上でさらに条件を続けて書くこともできます。

var a: String? = "Hello"

if let _ = a { 
    print("a は nil ではありません")
}

if let a = a, a.count >= 3 { 
    print("a は3文字以上です")
}

guard 

「もし...以外であればここで処理を終了する」という、処理を止めるためのものです。guard は英語で「守る」という意味ですが、その言葉通り「見張り役」のようなもので、「指定の条件を満たしていなかったらこの先は通しません!」という感じです。

guard 条件式 else {
    ...
    return
}

ブロックの最後で処理を抜ける return break を必ず行います。

switch

条件が複数ある場合に if 文より簡単に書くことができます。

var a = 100

switch a {
case 1:
    print("1")
// 複数指定
case 50, 75:
    print("50または75")
// 範囲指定
case 76...99:
    print("76〜99")
// 上記以外
default:
   print("その他")
}

変数のクラス型を判定したり、キャスト後の変数を使用する場合は以下のように書きます。

var a = 100

// データ型の判定
switch a {
case is String:
    print("String型です")
case is Int:
    print("Int型です")
default:
    print("その他")
}

// キャスト後の変数を使用する場合
switch a {
case let value as String:
    print("\(value)はString型です")
case let value as Int:
    print("\(value)はInt型です")
default:
    print("その他")
}

ただ、if 文の if let a = a, a.count >= 3 { ... } のように細かい条件式が書けないので、そういった場合は if 文を使いましょう。

2つの変数を同時にチェックするとこともできます。

var a: String? = "a"
var b: String? = nil

switch (a, b) {
case let (a?, b?):
    print("a: \(a), b: \(b)")
case (nil, nil):
    print("a: nil, b: nil")
default:
    print("a: \(a ?? "nil"), b: \(b ?? "nil")")
}

おさらい

私は条件が2つくらいだとif 文で書きますが、3つ以上だと見やすさの観点からなるべく switch 文で書くようにしています。

guard の使い方は最初よくわからないと思いますが、値の検証(バリデーション)でよく使われます。フォーム送信時に入力項目が未入力だったらここでエラーにする、とかです。

ちなみに、今回「〜であれば」「〜でなければ」という条件分岐の話でしたが、変数の代入にも分岐代入なるものがあります。三項演算子 論理演算子 というもので、実はよく使うのでここで紹介しておきます。

三項演算子
条件式 ? a : b
の形で使用し、条件式 が true の場合は a、false の場合は b を返します。

let a: Int? = 100
let message = a == 100 ? "100です" : "100ではありません"
print(message) // "100です"

論理演算子
a ?? b の形で使用し、 a が nil でなければ a、nil の場合は b を返します。

let a: String?
let b = a ?? ""
print(b) // ""


次回はループ処理についてご紹介します。

この記事が気に入ったらサポートをしてみませんか?