プログラミング入門12 switch文で値によって処理を分岐させよう

 switch(スイッチ)文は値に応じて処理を分岐させる制御構文です。「この値が◯◯◯だったら△△△を実行し、●●●だったら▲▲▲を実行する」といったようにプログラムの流れを制御できます。

switch文の制御の流れ
 switch文は次のように書きます。

switch 評価する対象の変数または定数 {
case 値【1】:
変数または定数の値が値【1】だったときに実行する処理
case 値【2】:
変数または定数の値が値【2】だったときに実行する処理
default:
変数または定数の値がどれにも当てはまらなかったときに実行する処理
}
 まず「switch」と書き、続けて評価する対象の値を書きます。続けて「{」と「}」の間に「case」を書き、条件となる値と「:」を書きます。「:」の後に条件となる値だったときに実行する処理を書きます。「case」は複数書くことができます。最後に「default」と「:」を書き、「:」の後にどの条件にも当てはまらなかったときに実行する処理を書きます。

 それでは、プログラムを書いてみましょう。次のプログラムはきのこの種類を判別するプログラムです。

let きのこ = "しいたけ"
switch きのこ {
case "しいたけ":
println("きのこの種類はしいたけ")
case "まつたけ":
println("きのこの種類はまつたけ")
case "えりんぎ":
println("きのこの種類はえりんぎ")
default:
println("謎のきのこ")
}
 「しいたけ」「まつたけ」「えりんぎ」の3つの「case」を作り、それぞれの値だったときに「println("きのこの種類は◯◯◯")」が実行されます。いずれの種類にも合わなかった場合には「println("謎のきのこ")」が実行されます。

switch文を使ったプログラムの例
 またif文と同様、switch文で対象とする変数(または定数)の値と条件となる値は、同じ型でなければいけません(型の組み合わせによっては、評価できるように自動的に変換してくれる場合があります。特殊なケースになるので、今回は割愛させていただきます)。

caseは複数の値を条件にすることができる

 上記のswitch文では、1つの「case」に対して1つの値のみ条件にしていましたが、この「case」1つに対して複数の値を条件にすることができます。

 複数の値を条件にしたい場合は「case」の1つ目の値の後に「,」を書き、その後に2つ目の値を書きます。

switch 評価する対象の変数または定数 {
case 値【1】, 値【2】:
変数または定数の値が値【1】または値【2】だったときに実行する処理
case 値【3】, 値【4】:
変数または定数の値が値【3】または値【4】だったときに実行する処理
default:
変数または定数の値がどれにも当てはまらなかったときに実行する処理
}
 先ほどのプログラムを少し変えてみましょう。先ほどのプログラムは「case」にきのこの名前を平仮名で書いていましたが、この条件にカタカナと漢字を加えてみましょう。

let きのこ = "松茸"
switch きのこ {
case "しいたけ", "シイタケ", "椎茸":
println("きのこの種類はしいたけ")
case "まつたけ", "マツタケ", "松茸":
println("きのこの種類はまつたけ")
case "えりんぎ", "エリンギ":
println("きのこの種類はえりんぎ")
default:
println("謎のきのこ")
}
 こうすることで「きのこ」の値にカタカナや漢字が入った場合でも、それぞれの「case」で判定できるようになりました。

caseに複数の値を指定したプログラムの例
caseは範囲を条件にすることができる

 「case」は条件となる値を1つずつ指定するだけではなく、値と値の間となる範囲を指定することができます。

 「case」の値を範囲指定したいときは、値と値の間を「...」でつなぎます。なお、範囲指定に使う値の型は数値の型(Int型、Float型、Double型)しか利用できません。

switch 評価する対象の変数または定数 {
case 値【1】...値【2】:
変数または定数の値が値【1】~値【2】の間だったときに実行する処理
case 値【3】...値【4】:
変数または定数の値が値【3】~値【4】の間だったときに実行する処理
default:
変数または定数の値がどれにも当てはまらなかったときに実行する処理
}
 範囲を指定する「case」を書いてみましょう。次のプログラムは松茸の価格を判定するプログラムです。1円から1万円の間であれば「println("松茸は10,000円以下")」が実行されます。

let 松茸 = 8000
switch 松茸 {
case 0:
println("松茸はタダ")
case 1...10000:
println("松茸は10,000円以下")
default:
println("高級な松茸")
}
 このように、範囲指定の「case」と値を1つずつ指定する「case」は1つのswitch文の中で組み合わせることができます。