はじめに
プログラムの流れを変えるには、条件分岐を使用します。
本記事では、Swiftのif文とswitch文について説明します。
環境
Xcode:9.4.1
Swift:4.1.2
目次
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は等しい") }