🐈

【Swift】Switch文caseの作成方法をまとめました。使ってみましょう!

2023/11/14に公開
3

Switch文とは?

Switch文とは、if文のように式の値に応じて分岐処理を行うための文です。
switch文もif else構文のように小括弧を省略でき、別にbreakキーワードを作成しなくてもcase内部のコードを実行すると、switch構文から抜けます。 また、比較値が明確に限定的な値である場合を除き、ほとんどの場合、必ずデフォルトを作成しなければなりません。
もし、上から条件に合ったcaseを連続的にbreakせずに実行するには、fallthroughキーワードを使います。 caseに複数の比較値を「、」(comma)で区切って一度にチェックすることができます。
Swift文の条件には、整数値以外にも様々な値(整数、浮動小数タイプ、文字、文字列、テュフなど)が入ることができます。 ただし、必ず入力値と各caseに入る比較値のデータタイプが同じでなければなりません。

Switch文の必要性

if else文で様々な条件を処理するにはelse ifを繰り返し繰り返す必要がありますが、これは可読性を低下させます。
プログラミングでは可読性は重要な要素であるため、条件分岐が4つ以上の場合はswitch caseを使うことが望ましいです。

switch構文の基本形態

switch 値や式 {
case1:
    //・・・処理・・・
case2 ,3:
    //・・・処理・・・
case4:
    //・・・処理・・・
default:
    //・・・処理・・・
}

様々な入力値、fallthroughキーワードを使用

fallthroughキーワードを明示すると、1つのcase文を経て、その次にcase文が条件に合わなくても続けて実行します。

var someEmoji: Character = "🤭"

switch someEmoji {

case "😀","😉","🤭":
	print("\(someEmoji)は笑う絵文字です。")
fallthrough

case "😱":
	print("\(someEmoji)は気分が良くない絵文字です。")

default:
	print("\(someEmoji)は絵文字です。")
}

// 🤭は笑う絵文字です。
// 🤭は気分がいまいちな絵文字です。

case "😱" 以降にfallthroughキーワードを明示していないため、break処理されて構文を抜けます。

範囲演算子を用いたSwitch文

Swiftでは、値の範囲を簡単に表示できる範囲演算子が存在します。

範囲演算子
  • 閉鎖範囲演算子A···B : A から B を含む A から B までの数
  • 半閉塞範囲演算子A..<B : A から B 未満までの数
  • A...: A 以上の数
  • ...A:A以下の数
  • ..<A:A未満の数
var intVal: Int = 5

switch intVal {

case 0: print("Value is zero")

case 1...10: print("Value is in 1~10")

case 11..<20:print("Valueは11以上20未満")

case Int.min..<0: print("Valueは負数")

default: print("Valueは20以上の正数")

}

intVal = 20

switch intVal {

case 0: print("Value is zero")

case 1···10: print("Value is in 1~10")

case 11..<20:print("Valueは11以上20未満")

case Int.min..<0: print("Valueは負数")

default: print("Valueは20以上の正数")

}

実行結果

Value is in 1~10
Value20以上の正数

###値バインディングを使ったswitch case文

var tupleValue: (name: String, age: Int) = ("hyung8", 20)

switch tupleValue {

case ("hyung8", 28):
	print("名前と年齢両方合わせました!")
case ("hyung8", let age): //letを付けた値バインディング。
	print("名前だけ合っていました。 入力した年齢は\(age)です。")
case (let name, 28): //letを付けた値バインディング。
	print(" 年だけ合っていました。 入力した名前は\(name)です。")
default:
	print("どちらでもありません。")
}

tupleValue = ("hyung8", 28)

switch tupleValue {

case ("hyung8", 28):
	print("名前と年齢両方合わせました!")
case ("hyung8", let age):
	print("名前だけ合っていました。 入力した年齢は\(age)です。")
case (let name, 28):
	print(" 年だけ合っていました。 入力した名前は\(name)です。")
default:
	print("どちらでもありません。")
}

実行結果

名前だけ合っていました。 入力した年齢は20です。
名前と年齢両方合わせました!

Discussion

ようてんようてん

サンプルコードがところどころ変数名が違っていたり、タイポがあるようです。
インデントも合った方が見やすいと思いました。

以下変更点です。

  • someCountryという変数名をsomeEmojiに変更しました。
  • some EmojiをsomeEmojiにしました。
var someEmoji: Character = "🤭"

switch someEmoji {
case "😀", "😉", "🤭":
    print("\(someEmoji)は笑う絵文字です。")
    fallthrough

case "😱":
    print("\(someEmoji)は気分が良くない絵文字です。")

default:
    print("\(someEmoji)は絵文字です。")
}

・範囲演算子が一部「・・・」になっていました。

var intVal: Int = 5

switch intVal {
case 0:
    print("Value is zero")
case 1...10:
    print("Value is in 1~10")
case 11..<20:
    print("Valueは11以上20未満")
case Int.min..<0:
    print("Valueは負数")
default:
    print("Valueは20以上の正数")
}

intVal = 20

switch intVal {
case 0:
    print("Value is zero")
case 1...10:
    print("Value is in 1~10")
case 11..<20:
    print("Valueは11以上20未満")
case Int.min..<0:
    print("Valueは負数")
default:
    print("Valueは20以上の正数")
}

hyung8hyung8

コードレビュー ありがとうございます。
修正しました😀

ようてんようてん

早速対応していただきありがとうございます!
Swiftのswitchについて、記事のおかげで理解できました☺️