【Swift】switch文の使い方(Swift 2.1、XCode 7.2)
switch文とは、1つの式の結果をもとに条件分岐させるときに使う制御文である。switch文で記述できるものは、すべてif文に書き換えることができる。
1 2 3 4 5 6 7 8 |
switch 式 { case 値 : 処理 case 値 : 処理 default: 処理 } |
以下のコードはswitch文を使った例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
/* ** switch文のサンプル */ var test = 15 switch test { case 0: print("おはよう") case 10,15: print("こんにちは") case 20: print("こんばんは") default: print("該当無し") } // 実行結果 // こんにちは |
上記のコードをif文に書き換えると以下のコードになる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
/* ** if文のサンプル */ var test = 15 if ( test == 0 ) { print("おはよう") } else if( test == 10 || test == 15) { print("こんにちは") } else if( test == 20 ) { print("こんばんは") } else { print("該当無し") } // 実行結果 // こんにちは |
switch文をif文で書き換えることができるならif文だけ覚えておけばいいように思えるが、switch文が存在する利点がある。
それは、switch文では条件分岐の判定に使う式や変数が「switch」の横にしか出てこないのでコードがすっきりすることや、値の先頭が縦一直線に並ぶので縦にらみしやすいなどが挙げられる。
また、if文では先頭の条件式を削除した場合に後続の条件式をelse if からifに変えるなど、条件の追加、削除が他の条件式に影響を及ぼす場合があるが、swich文はそのようなことがないため追加、削除がしやすい。
Swiftでは、caseの処理が終わったあとにbreakが記述されて無くてもswitchの処理が自動で終了するようになっている。
例えば、上記のコードがJava言語だった場合、print(“50から70の間")が実行されたあと、そのまま処理が止まらずにprint(“0から70の中には入っていない")が実行されてしまう。一方、swiftではprint(“50から70の間")が実行された時点でswitchの処理が終了する。
後続の処理をそのまま続けたい場合は以下のコードのようにfallthroughを記述する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
/* ** case文にfallthroughを記述する例 **【説明】fallthroughを記述した場合、caseの処理後に下のcase処理が実行される。 */ var a = 15 switch a { case 10: print("Hello,") fallthrough //「case 15」の処理も実行する case 15: print("Good,") fallthrough //「case 20」の処理も実行する case 20: print("Morning,") default: print("You") } // 実行結果 // Good, // Morning, |
他の言語では、異なる値で同じ処理をする場合には以下のコードのようにcaseのみ列挙するような書き方ができたが、Swiftの場合はエラーになる。後続の処理に流す場合はfallthrough、何もせずに終了する場合はbreakを記述すること。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
/* ** case文の記述エラー */ var a = 15 switch a { case 10: //caseの処理が何も記述されていないのでエラー case 15: //caseの処理が何も記述されていないのでエラー case 20: print("Morning,") default: print("You") } // 実行結果 // 'case' label in a 'switch' should hove at least one executable statement. |
switchの条件式には整数以外の型や式を記述することができる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
/* ** switchの条件式に計算式を指定 */ var a = 10 var b = 20 switch a + b { case 10: print("おはよう") case 20: print("こんにちは") case 30: print("こんばんは") default: print("該当無し") } // 実行結果 // こんばんは // //switchの条件式にString型の変数を記述する例 // var test:String = "朝" switch test { case "朝": print("おはよう") case "昼": print("こんにちは") case "夜": print("こんばんは") default: print("該当無し") } // 実行結果 // おはよう |
caseの値にも柔軟な設定ができるようになっている。以下のコードは、caseの値にレンジ演算子を用いて範囲を指定した例。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
/* ** caseの値に範囲を指定 */ var a = 15 switch a { case 0 ..< 15: //0以上15未満 print("おはよう") case 15 ..< 30: //15以上30未満 print("こんにちは") case 30 ..< 45: //30以上45未満 print("こんばんは") default: //すべての条件を満たさなかった場合 print("該当無し") } // 実行結果 // こんにちは |
switchの条件式にタプルを指定することができる。以下のコードのように、判定に使わないタプルの値をアンダースコアにすれば無視させることができる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
/* ** switchの条件式にタプルを指定する例 ** caseの値でアンダースコアを記述すれば、該当要素は無視される。 */ var a = (10,20,30) switch a { case (10,20,_): print("おはよう") case (10,_,40): print("こんにちは") case (_,30,40): print("こんばんは") default: print("該当無し") } // 実行結果 // おはよう |
以下のコードのように、switchの式をcaseで変数または定数として受け取り、where句を使って条件式を記述できる。この仕様によってswitchの自由度がかなり向上したように感じる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
/* ** switchの式をcaseで受け取り、where句で条件式を記述する例 ** 以下の例では、testの値10を定数aで受け取り、where句で利用している。 */ var test = 10 var b = 2 switch test { case let a where a * b > 20: print("おはよう") case let a where a * b > 10: print("こんにちは") case let a where a * b > 0: print("こんばんは") default: print("該当無し") } // 実行結果 // こんにちは |