
はじめに
プログラミング初心者が特に苦戦しやすいポイント、switch文。
今回は仕様や目的を正しく学ぶことで、苦手意識を克服していきましょう。
switch文とは
if文と同様、条件分岐ができる制御構造です。
if-elseの単一条件の分岐と異なり、一つの条件式の結果を複数の値で構えて、処理を分岐できるのが特徴です。
基本的な使い方
今回はJavaScript準拠で解説します。
言語によって多少の違いがあるため、JavaScript以外を使用する方は詳しく調べてみてください。
一部の仕様については記事内でも紹介します。
switch (条件式) { case 値1: 処理1 case 値2: 処理2 case 値3: 処理3 break; default: 一致しない場合の処理 }
switchの条件式をcaseの値と比較し、一致した場合はcase内の処理が実行されます。
また、一度caseに一致した場合、以降のcase内の処理を順に実行します。(fall-throughと呼びます)
どのcaseの値にも一致しない場合、default内の処理が実行されます。
breakを実行するとswitch文の処理を終了します。
特殊な仕様
defaultはどこに書いてもいい
defaultはどの位置に差し込んでも問題ありません。
どこで定義しても同様に、引数が各caseに一致しない場合に開始されます。
ただし変なところに差し込むと混乱するため、基本的には最初や最後に書いた方が良いでしょう。
const switchFunction = (num) => { switch (num) { case 1: console.log("first"); default: console.log("default"); case 2: console.log("second"); } } switchFunction(1); => first default second // case 1で一致した結果、defaultも実行されている switchFunction(0); => default second // 一致するcaseがないためdefaultから開始し、以降を実行する
複数のcaseで同じ処理を実行できる
defaultを含む、複数のcaseを並列することができます。
const switchFunction = (num) => { switch (num) { default: case 0: console.log("error"); break; case 1: console.log("first"); case 2: console.log("second"); } } switchFunction(0); => error switchFunction(3); => error // case 0, defaultが同じ処理のため、同様の実行結果となる
Swift等ではfall-throughを明記する
Swift, Go等では、デフォルトでfall-throughしません。つまり各処理で暗にbreakします。
明示的にfallthroughを記載することで、一つ次の処理も実行することができます。
var num = 1 switch num { case 1: print("first") fallthrough case 2: print("second") case 3: print("third") default: print("error") } => first second // fallthroughの直後は実行される。以降は実行されない
switch文がない言語での代用
fall-throughがないため、switch文の完全互換ではありませんが、似たような条件分岐として使用できるものを紹介します。
むしろこちらの方がわかりやすい・馴染みがある人も多いかもしれません。
Ruby
Rubyではcase-whenで実装されています。fall-throughはありません。
最初に一致したwhen内のみ実行して終了します。
num = 1 case num when 1 puts "first" when 2 puts "second" else puts "error" end => first
また、caseの引数を省略することで、whenに直接条件式を書くこともできます。
こちらはif-elsif-elseのイメージに近いです。
num = 1 case when num.zero? puts "zero" when num.odd? puts "odd" when num.even? puts "even" end => odd
SQL
sqlでもcase文が使用できます。
取得結果を予め成型しておきたい場合に便利です。
SELECT id, name, CASE WHEN status = 0 THEN 'disable' WHEN status = 1 THEN 'enable' ELSE 'deleted' END FROM users
所感
同じ条件分岐でもif-elseと違って、default, fall-through, breakといった特殊な処理が目立ちます。
ただの条件分岐だけであればif-elseでもいいので、本当にswitch文を使う必要があるか見直してみましょう。
「とりあえず全部にbreakを入れて条件分岐をしたつもりが、1個だけ書き忘れて意図せずfall-throughさせてしまった」というのは、特に初心者がやりがちなミスだと思います。
あえてswitch文を利用するなら、大量のデータを解析をしつつ、その内容によって処理を差し替えるようなバッチ処理などで活用してみたいですね。
この場合は「開始位置と終了位置を決められる連続処理」として見ると、fall-through, breakの独特な挙動を取り入れる価値が高そうに思います。
参考
