switch文は、if文などと同様に、条件分岐を行うための指示です。switch文は、変数や式の値をいくつか列挙して、それらの値にヒットしたときの処理を指定するというものです。if-else-if文でも同じようなことができなくもないですが、一つの変数や式の値だけを判定するためにはswitch文を使用するべきです。if-else-if文ですと冗長でバグを作り込むかもしれませんし、処理が遅い可能性もあります。

switch文の書き方

基本的なswitch文の書き方を次に示します。

switch 値または式 {
case 値1:
	値1のときの処理
case 値2:
	値2のときの処理
case 値3:
	値3のときの処理
default:
	上記の値1,2,3以外の場合の処理
}

“値または式”が判定対象です。caseの後ろには、整数または文字列を使うことができます。defaultの処理は、caseで指定された条件のいずれにもヒットしなかった場合、実行されます。
case、defaultとも何らかの処理を記述する必要があります。何も行わない場合には、”break”を記述しなければなりません。breakはswitch文の処理を終了させるだけの役目です。

複数の値に同じ処理を行う

複数の値に同じ処理を行いたい場合には、caseの後ろに値を列挙します。

switch 値または式 {
case 値1 , 値2:
	値1か値2のときの処理
case 値3:
	値3のときの処理
default:
	上記の値1,2,3以外の場合の処理
}

fallthroughを使って次のcaseの処理を実行する

caseにヒットした場合、そのままでは、次のcaseは無視されます。
caseにヒットした後、その後のcaseの処理も実行したい場合には、明示的にfallthroughを指定します。

switch 値または式 {
case 値1:
	値1のときの処理
	fallthrough
case 値2:
	値2のときの処理
case 値3:
	値3のときの処理
default:
	上記の値1,2,3以外の場合の処理
}

上の例の場合、値1がヒットしたとき、”値1のときの処理”を実行した後、”値2のときの処理”も実行されます。”値3のときの処理”は、”値2のときの処理”の後にfallthroughが無いため実行されません。

範囲演算子を使用する

caseには、for-in文などでも使われる、範囲演算子を使用することができます。それにより、一つの値でなくある範囲の値にヒットさせることができます。

switch 値または式 {
case 範囲演算子1:
	範囲演算子1にヒットしたときの処理
default:
	上記のcaseにヒットしなかった場合の処理
}

caseで指定する条件には、整数や文字列以外に、タプルを使用することができます。タプルをswitch文で使用することはあまり多くないと思いますが知っておいて損はありません。具体例は後述します。

実際にswitch文を書いてみよう

シンプルな変数の判定を行ってみます。

let i : Int = 10
switch i {
case 10:
    print("これは十です。")
case 20:
    print("これは二十です。")
case 30:
    print("これは三十です。")
default:
    print("これは十、二十、三十以外の数字です。")
}

実行結果は次のようになります。

これは十です。

次に、switch文の判定対象を定数iから式に変えてみます。

let i : Int = 10
switch i * 2{
case 10:
    print("これは十です。")
case 20:
    print("これは二十です。")
case 30:
    print("これは三十です。")
default:
    print("これは十、二十、三十以外の数字です。")
}

実行結果は次のようになります。

これは二十です。

今度は、caseに範囲演算子を指定してみます。

let i : Int = 10
switch i {
case 1..<10:    // 1から10未満を意味します。
    print("これは1から9の間です。")
case 10...20:      // 10から20以下を意味します。
    print("これは1から20の間です。")
default:
    print("これは1から20の間ではありません。")
}

実行結果は次のようになります。

これは1から20の間です。

タプルを使用して、複数の値の組み合わせにヒットさせる例を示します。

let valuePair : (Int , String) = (1, "一")
switch valuePair {
    case (1 , "一" ):
        print("これは数字の1と漢数字の一です。")
    case (2 , "二" ):
        print("これは数字の2と漢数字の二です。")
    default:
        print("すみません、わかりませんでした。")
}

実行結果は次のようになります。

これは数字の1と漢数字の一です。

【おすすめ記事】
今話題のSwift!評判の良いスクールはどこ?
Swift(スウィフト)の本・参考書の評判
iOSアプリ開発入門!初心者にオススメのSwift学習サイト6選