はじめに
プログラムの流れを変えるには、条件分岐を使用します。
本記事では、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は等しい")
}