今回は、switch文について学習したので、アウトプットしていきます
※以下の内容は、学習内容のアウトプット用のため、誤りがある場合があります。予めご了承ください
switch文とは?
switch文を一言でいうと、パターンを利用して制御式の値に応じて実行文を切り替える制御構文です。
基本的な書き方は以下の通りです
switch 制御式 {
case パターン1:
制御式がパターン1にマッチした場合に実行される文
case パターン2:
制御式がパターン2にマッチした場合に実行される文
default:
制御式がいずれのパターンにもマッチしなかった場合に実行される文
}
switch文は、一度マッチして実行文を実行するとマッチングを終了し、それ以降のパターンはスキップするという特徴を持ちます。
if文やguard文は成立するか否かの2つのケースへの分岐でしたが、switch文はさらに多くのケースに分岐できます。
次は簡単な例を見ていきましょう
let a = -2
switch a {
case Int.min..<0:
print("aの負の値です")
case 1..<Int.max:
print("aは正の値です")
default:
print("aは0です")
}
実行結果:aは負の値です
whereキーワード
whereキーワードを利用すると、ケースにマッチする条件を追加できます。
これだけと、なんのことかさっぱりなので、早速、基本構文を見ていきましょう!
switch 制御式 {
case パターン 制御式:
制御式がパターン1にマッチし,かつ,条件式を満たす場合に実行される文
default:
制御式がいずれのパターンにもマッチしなかった場合に実行される文
次は、簡単な例です。
let optionalA: Int? = 5
switch optionalA {
case .some(let a)where a > 10:
print("10より大きい値\(a)が存在します")
default:
print("値が存在しない,もしくは10以下です")
実行結果: 値が存在しない,もしくは10以下です
上記の例では、定数optionalAは値を持っているため、***case .some(let a)***の部分にはマッチしますが、where a > 10という条件を満たしません。
break文
break文は、switch文のケースの実行を中断する文です。
簡単な例を見ていきましょう。
let a = 1
switch a{
case 1:
print("ログインに成功しました")
break
print("ログインに失敗しました")
default:
break
}
実行結果:ログインに成功しました
上記の例では、マッチするけーすcase1:内に2つのprint()関数が書かれていますが、2つ目のprint関数の前にbreak文が書かれているため、2つ目のprint関数は実行されません。
ラベル
ラベルはbreak文の制御対象を指定するための仕組みです。
switch文が入れ子になっている場合など、break文の対象となるswitch文を明示する必要があるケースで利用します。
入れ子・・・プログラミング用語で、あるモノの中にそれと同じモノを入れた構造という意味。
基本構造を見ていきましょう!
ラベル名: switch文
break ラベル名
では、今度は、ラベルが必要となる例を見ていきましょう。
import UIKit
let value = 0 as Any
outerSwitch: switch value{
case let int as Int:
let description: String
switch int {
case 1,3,5,7,9:
description = "奇数"
case 2,4,6,8,10:
description = "偶数"
default:
print("対象外の値です")//ここが読まれる
break outerSwitch
}
print("値は\(description)です")
default:
print("値がInt型ではありません")
}
実行結果:対象外の値です
上記の例では、Any型の値が1から10までのInt型であれば、その値が奇数か偶数かを出力するプログラムです。
指定された値0なので、対象外の値ですと出力されています。
では、今度はlet valueの指定を"aaa"に変更してみます。
import UIKit
let value = "aaa" as Any
outerSwitch: switch value{
case let int as Int:
let description: String
switch int {
case 1,3,5,7,9:
description = "奇数"
case 2,4,6,8,10:
description = "偶数"
default:
print("対象外の値です")
break outerSwitch
}
print("値は\(description)です")
default:
print("値がInt型ではありません")//ここが読まれる
}
実行結果:値がInt型ではありません
このように指定された値がInt型ではないため、2つ目のprint関数が呼ばれます。
fallthrough文
fallthrough文は、switch文のケースの実行を終了し、次のケースを実行する制御構文です。
let a = 1
switch a{
case 1:
print("ログインに成功しました")
fallthrough
case 2:
print("ログインに失敗しました")
default:
print("default")
}
実行結果:
ログインに成功しました
ログインに失敗しました
上記の例では、fallthrough文によって、実行が次のケースであるcase2に移ります。したがって、case1とcase2が出力されます。