Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

  1. トップページ
  2. Swift入門編 - switch文について

switch文について

みなさまどうも。いかがお過ごしでしょうか。

続きまして『switch文』(スイッチぶん)というのを勉強していきましょう。

『switch文』は『if文』と同じような感じで分岐処理を行うものです。『if文』では基本的に2通りずつ分岐処理をさせていくものでしたが『switch文』では同時に多数の分岐処理をさせていくことができます。

まず基本的な構文から確認していきましょう。このような感じになります。

let n = 1

switch n {
    case 1:
        print("1です。")

    case 2:
        print("2です。")

    default:
        print("defaultです。")
}

ちょっと構文がややこしいのでひとつひとつ確認していきましょう。

まず定数『n』に『1』が代入されていますね。これはいつもの定数です。

続いて『switch』と書いてあります。これは『if文』でいうところの『if』にあたるところです。『switch文』なので『switch』になりますね。

そして次に半角スペースとかを置いて『条件式』を書きます。ここに評価させたい定数や変数や演算式などを入れる感じです。今回は定数『n』が該当しますね。

ちなみに『条件式』の部分は『条件文』とか『比較対象』とか、単純に『式』なんて呼ばれることもあります。当サイトでは『条件式』と表記していますが、この辺はお好みでOKです。

そして『{}』を書き、その中に『case』と記述し、半角スペースをあけて『1』と記述し、さらに『:』を入力します。

これは「『条件式』に書いてある定数『n』の中身が『1』だった場合に『:』以降の処理を実行してね」といった命令になります。上記の場合は『print("1です。")』が実行されます。

この『case』を使った処理は『case文』と呼ばれます。まあそのままなんですが覚えておいて下さい。

続く『case 2』というのも同じような感じで、「定数『n』が『2』ならば『:』以降の処理を実行してね」といった命令になります。

最後に書いてある『default』という記述ですが、これはその前の『case』での評価がすべて成立しなかった場合に実行されます。

例えばこうしてみましょう。

let n = 3

switch n {
    case 1:
        print("1です。")

    case 2:
        print("2です。")

    default: // ここが実行されます。
        print("defaultです。")
}

定数『n』の値を『3』にしてみました。『case』で指定された値に『3』がありません。

なので上記の場合は『default』の処理である『print("defaultです。")』が実行されます。

この『default』を使った処理は『default文』と呼ばれます。先程の『case文』と共に覚えておくようにしましょう。

ちょいと日本語で書いておきますのでよくわからなくなったら以下を確認してみてください。

switch 条件式 {
    case 比較する値など: // 『case文』は複数設置することができます。
        // ここに処理...

    default:
        // ここに処理...
}

それと、ちょいと『switch文』の処理の流れというか処理の順番みたいなものを確認しておきます。

『switch文』はまず『条件式』の演算が行われ、その結果が各『case文』に該当するかどうかを上から順番に確認されるような感じになっています。

以下の処理をちょっと見てみて下さい。

switch 1 + 1 {
    case 2:
        print("2です。")

    default:
        print("defaultです。")
}

上記の『条件式』は『1 + 1』になっていますね。『条件式』の演算が最初に行われるため、『1 + 1』の演算結果の『2』が比較対象となります。

その後に各『case文』と一致するかどうかの判定が上から順番に行われます。上から順番に行われる、というわけなので以下のように『case 2』を複数用意しても実行されるのは最初の『case 2』となります。

switch 1 + 1 {
    case 2: // 実行されるのはここのみです。
        print("2です。")

    case 2:
        print("2です。その2")

    case 2:
        print("2です。その3")

    default:
        print("defaultです。")
}

ここまでは大丈夫そうでしょうか。

さて、では続いてSwiftにおける『switch文』の注意点について確認していきましょう。

まず基本的に『default文』は記述する必要があったりします。なので以下はエラーです。

let n = 1

switch n { // 『default文』がないためエラーです。
    case 1:
        print("1です。")

    case 2:
        print("2です。")
}

この「『default文』がないとエラーになる」という挙動はちょっとややこしく、「『条件式』の全ての結果が『case文』に記述されている場合のみ『default文』の省略ができる」という動作になります。なので以下の場合はOKです。

switch 1 { // これはOKです。
    case 1:
        print("1です。")
}

上記の『条件式』は数値『1』と直接記述していますので、比較対象が数値『1』から変化することはありません。なので上記の場合は『case 1』の処理さえ記述しておけば『default文』なしでもエラーが出なかったりします。

ただプログラミングをするにあたって、「全ての『条件式』の結果を網羅する」というのが不可能だったりする場合が多いため、『default文』は必ず記述しておく、というイメージを持っておいた方が無難な気がします。

あと『default文』は必ず『switch文』の最後に記述する必要があります。

let n = 1

switch n { // 『default文』を最初に書いたためエラーです。
    default:
        print("defaultです。")

    case 1:
        print("1です。")
}

ちなみに『default文』のみを記述することはOKだったりします。

let n = 1

switch n { // 『default文』のみ記述するのはOKです。
    default:
        print("defaultです。")
}

まあ『default文』のみを記述するパターンはまず使うことはないと思いますが一応覚えておいて下さい。

そして続いての注意点ですが、『case文』や『default文』の中身を空にすることはできません。こんなパターンですね。

let n = 1

switch n {
    case 1: // 『case 1』となった場合の処理を記述しないとエラーになっちゃいます。

    case 2:
        print("2です。")

    default:
        print("defaultです。")
}

ただ、プログラミングを行うにあたってとある状況になったら「もう何もしたくない。放っといてくれよ」というセンチメンタルな気分になることは多々あります。

そういう時は『break文』というのを使ってみましょう。使い方はこんな感じです。

let n = 1

switch n {
    case 1:
        break // このように『break』と記述すると『switch文』を抜けることができます。つまり「何もしたくない」という夢が叶います。

    case 2:
        print("2です。")

    default:
        print("defaultです。")
}

上記の『case 1』の処理をみてみましょう。『break』って記述してありますね。

『break』は「『switch文』とかループ処理とかを抜けて!」って命令になるので『break』と記述しちゃえば処理を何も行わず『switch文』を抜けることが可能になります。

Swift以外の言語の『switch文』では「『break文』を記述しておかないと続く処理をずっと実行してしまう」という仕様になっていることが多いです。他の言語に精通している方は馴染みある感じかと思います。

ちょいとPHPの『switch文』を見てみましょう。文法はSwiftと同じような感じなので雰囲気で読めると思います。

$num = 1;
 
switch($num){
    case 1:
        var_dump('1です!');
 
    case 2:
        var_dump('2です!');
 
    case 3:
        var_dump('3です!');
 
    default:
        var_dump('defaultです!');
        break;
}

上記の場合は『case 1』の条件が成立するので『var_dump('1です!');』という処理のみが実行されそうな気がしますよね。

しかし、実行結果はこうなります。

string(10) "1です!"
string(10) "2です!"
string(10) "3です!"
string(16) "defaultです!"

『case 1:』の処理から先の処理が全て実行されちゃっていますね。これが他の言語の『switch文』の一般的な動作になります。

上記の場合で「『case文』ごとの処理しか実行されないようにする」には各『case文』の最後に『break文』を記述してあげる必要があります。こんな感じです。

$num = 1;
 
switch($num){
    case 1: // 『break文』が記述されているため、この処理はこの『case 1』の処理のみが実行されます。
        var_dump('1です!');
        break;

    case 2:
        var_dump('2です!');
        break;

    case 3:
        var_dump('3です!');
        break;

    default:
        var_dump('defaultです!');
        break;
}

Swiftの場合は「続く処理が全て実行される」という挙動にならないため、各『case文』ごとの『break』は記述する必要がありません。

尚、逆に「続く処理を実行したいぜ!」というセンチメンタルな気分になったら『fallthrough』と記述してあげましょう。使い方はこんな感じです。

let n = 1

switch n {
    case 1:
        print("1です。")
        fallthrough

    case 2:
        print("2です。")

    default:
        print("defaultです。")
}

上記の場合は『case 1』が該当しますね。そして『case 1』の処理に『fallthrough』が記述してあるため、実行結果は以下になります。

1です。
2です。

『case 2』の処理も実行してくれていますね。

と、ここで注意点です。「『fallthrough』と記述すると続く処理が全て実行される」と思ってしまった方がいらっしゃるかもしれません。

しかし、『fallthrough』と記述した場合は「次の『case文』または『default文』の処理のみが問答無用で実行される」上記の実行という挙動になるので要注意です。

なので、他の言語のように「続く処理を全て実行したい」となった場合は全ての『case文』に『fallthrough』と記述する必要があります。こんな感じですね。

let n = 1

switch n {
    case 1:
        print("1です。")
        fallthrough

    case 2:
        print("2です。")
        fallthrough

    case 3:
        print("3です。")
        fallthrough

    default:
        print("defaultです。")
}

上記の実行結果はこうなります。

1です。
2です。
3です。
defaultです。

『case 1』からの処理が全て実行できています。『fallthrough』の挙動は勘違いしやすいところなので注意するようにして下さい。

さて、続いてもういっちょ『switch文』の注意点を確認していきたいと思います。まず以下の処理を見てみて下さい。

let n : Int = 1

switch n {
    case 1:
        print("1です。")

    case 2:
        print("2です。")

    default:
        print("defaultです。")
}

注目すべきは定数『n』です。この定数『n』はInt型となっているため、文字列とかを入れることはできません。

なので以下の処理はエラーになります。

let n : Int = 1

switch n {
    case "1": // ここでエラーが出ます。
        print("1です。")

    case 2:
        print("2です。")

    default:
        print("defaultです。")
}

『case "1"』というところに注目です。『条件式』の定数『n』はInt型で定義されているため文字列が入ることは絶対ありません。

なので『case "1"』のように、『case文』でデータ型が違う値と比較させようとするとその時点でエラーになります。

他の言語では単純にその『case文』が実行されないだけだったりしますのでエラーになることはない場合がほとんどです。Swiftの『switch文』はちょっと特殊なので気をつけて下さい。

Swift以外の他の言語では『条件式』を『()』で包むのが一般的な記法になっています。プログラミングを長年やってる方は『()』を使った記法の方が馴染みある感じかと思います。

// これはPHPです。
$num = 1;
 
switch($num){
    case 1: // 『break文』が記述されているため、この処理はこの『case 1』の処理のみが実行されます。
        var_dump('1です!');
        break;

    case 2:
        var_dump('2です!');
        break;

    case 3:
        var_dump('3です!');
        break;

    default:
        var_dump('defaultです!');
        break;
}

この『()』を使った記法、Swiftでも使用可能なのでお好みで使ってしまってOKです。ただSwiftの場合は『()』を使わない方が多数派です、多分。(著者調べ)

というわけで『switch文』については以上になります。続いての記事では『範囲演算子』と『for-in文』についてやっていきましょう。ではこの辺で失礼致します。

この記事は桜舞が執筆致しました。

著者が愛する小型哺乳類

桜舞 春人 Sakurama Haruto

ISDN時代から様々なコンテンツを制作しているちょっと髪の毛が心配な東京在住のプログラマー。生粋のロングスリーパーで、10時間以上睡眠を取らないと基本的に体調が悪い。好きなだけ寝れる生活を送るのが夢。ゲームとスポーツと音楽が大好き。誰か髪の毛を分けて下さい。

記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。