条件分岐

Swiftの条件分岐にはif文とswitch文があります。

if文

ある条件によって処理を分岐させるにはif文を使用します。

基本構文

もっとも基本的な if文は以下の書式で記述します。JavaやC#とは異なり条件式を()に入れる必要はありません

if 条件式 {
  // 条件式が満たされた時に実行する処理
}

以下にサンプルコードを示します。

let x = 3

if x < 5 {
    print("変数xは5未満です")
}

条件式が満たされなかった場合の処理

if文で条件式が満たされたなかった場合は、elseで分岐させます。

if 条件式 {
  // 条件式が満たされた時に実行する処理
} else {
  // 条件式が満たされなかった時に実行する処理
}

以下にサンプルコードを示します。

let x = 5

if x < 5 {
    print("変数xは5未満です")
} else {
    print("変数xは5以上です")
}

条件式が複数ある場合の書式

条件式が複数ある場合は、else ifを使用します。

if 条件式1 {
  // 条件式1が満たされた時に実行する処理
} else if 条件式2 {
  // 条件式2が満たされた時に実行する処理 
} else {
  // いずれの条件式も満たされなかった時に実行する処理
}

以下にサンプルコードを示します。

let x = 5

if x < 5 {
    print("変数xは5未満です")
} else if x < 10 {
    print("変数xは5以上10未満です")
} else {
    print("変数xは5以上です")
}

switch文

switch文を使用すると、特定の値ごとに処理を書き分けることができます。

基本構文

もっとも基本的なswitch文の書式を以下に示します。JavaやC#のように、各caseの終わりにbreakを書く必要はありませんが、何も処理をしないcaseの場合にはbreakを書きます。

switch 値 {
case 値1:
  // 値1に合致した時に実行する処理
case 値2:
  // 値2に合致した時に実行する処理
case 値n:
  // 値nに合致した時に実行する処理
default:
  // いずれのcaseの値にも合致しない場合の処理
}

以下にサンプルコードを示します。

let x = 5

switch x {
case 1:
    print("値は1です")
case 2:
    print("値は2です")
case 3:
    print("値は3です")
default:
    print("値は1から3以外です")
}

フォールスルー

フォールするーとは、1つのcaseが終了した後に次のcaseにも処理を移すことです。

swiftでは1つのcaseが終了すると自動的にswitchが終了します。ではどのようにしてフォールスルーをするかというと、以下のようにfalthroughを使用します。

falthroughがあると次のcaseへと処理を移すことができます。

switch 値 {
case 値1:
  処理1
  fallthrough  // 次のcaseへと流れる
case 値2:
  // 値2に合致した時に実行する処理
case 値n:
  // 値nに合致した時に実行する処理
default:
  // いずれのcaseの値にも合致しない場合の処理
}

以下にサンプルコードを示します。

xの値が1の場合は case 1の部分が実行されますが、falthroughの記述があるためcase 2も実行されます。したがって「値は1です」と「値は1または2です」が表示されます。

let x = 1

switch x {
case 1:
    print("値は1です")
    fallthrough
case 2:
    print("値は1または2です")
case 3:
    print("値は3です")
default:
    print("値は1から3以外です")
}

複数の値と比較する

caseには、以下の書式に示すように複数の値との比較をすることもできます。

switch 値 {
case 値1, 値2:
  // 値1または値2に合致した時に実行する処理
case 値3, 値4, 値5:
  // 値3〜値5のいずれかに合致した時に実行する処理
case 値n:
  // 値nに合致した時に実行する処理
default:
  // いずれのcaseの値にも合致しない場合の処理
}

以下にサンプルコードを示します。この例ではx = 4であるため、「case 3, 4, 5」が実行されます。

let x = 4

switch x {
case 1,2:
    print("値は1または2です")
    fallthrough
case 3,4,5:
    print("値は3〜5のいずれかです")
default:
    print("値は1から5以外です")
}

範囲演算子を使用する

caseには範囲演算子を使用することもできます。

switch 値 {
case 値1...値2:
  // 値1以上、値2以下の場合に実行する処理
case 値3..<値4:
  // 値3以上値4未満の場合に実行する処理
default:
  // いずれのcaseの値にも合致しない場合の処理
}

以下にサンプルコードを示します。xの値は5ですので、case 4..<7が実行されます。

let x = 5

switch x {
case 1...3:
    print("値は1〜3の間です")
case 4..<7:
    print("値は4以上〜7未満のいずれかです")
default:
    print("値は1から6以外です")
}

タプルとの比較

タプル値との比較を行うこともできます。case で比較するタプル値で「_」を使用すると、その部分はワイルドカード扱いとなり、どんな値でも一致することになります。

以下にサンプルコードを示します。

let x = (200, 200, 300)
switch x {
case (100, 200, 300):
    print("全ての値が一致します")
case (200, _, _):
    print("先頭の値が一致しています")
default:
    print("いずれにも一致しません")
}

一致した値を定数で受け取って使用する

caseで一致した値は定数として受け取って使用することができます。これをバリューバインディングと呼びます。定数で受け取るにはletを使用します。

以下にサンプルコードを示します。

1つめのcaseは、タプルの右側の値が一致した時に左側の値を定数xValに受け取っています。

2つめのcaseは、タプルの左側の値が一致した時に右側の値を定位数yValに受け取っています。

let location = (7, 12)

switch location {
case (let xVal, 6...12):
    print("yが6...12の範囲にあるときのxValは\(xVal)です")
case (6...12, let yVal):
    print("xが6...12の範囲にあるときのyValは\(yVal)です")
default:
    print("いずれにも一致しません")
}

詳細な条件を指定する

case句には、whereを使用して詳細な条件をしていることができます。
以下にサンプルコードを示します。

以下の例では、タプルの値を定数で受け取り大小比較を行なっています。

let location = (7, 8)

switch location {
case let(xVal, yVal) where xVal > yVal:
    print("xValはyValよりも大きい")
case let(xVal, yVal) where xVal < yVal:
    print("xValはyValよりも小さい")
default:
    print("xValとyValは等しい")
}