LoginSignup
0
1

More than 3 years have passed since last update.

switch文を理解しよう!

Posted at

今回は、switch文について学習したので、アウトプットしていきます
※以下の内容は、学習内容のアウトプット用のため、誤りがある場合があります。予めご了承ください

switch文とは?

switch文を一言でいうと、パターンを利用して制御式の値に応じて実行文を切り替える制御構文です。

基本的な書き方は以下の通りです

qiita.rbvar
switch 制御式 {
case パターン1:
制御式がパターン1にマッチした場合に実行される文

case パターン2:
制御式がパターン2にマッチした場合に実行される文

default:
制御式がいずれのパターンにもマッチしなかった場合に実行される文
}

switch文は、一度マッチして実行文を実行するとマッチングを終了し、それ以降のパターンはスキップするという特徴を持ちます。
if文やguard文は成立するか否かの2つのケースへの分岐でしたが、switch文はさらに多くのケースに分岐できます。

次は簡単な例を見ていきましょう

qiita.rbvar
let a = -2
switch a {

case Int.min..<0:
print("aの負の値です")

case 1..<Int.max:
print("aは正の値です")

default:
print("aは0です")

}

実行結果:aは負の値です

whereキーワード

whereキーワードを利用すると、ケースにマッチする条件を追加できます。
これだけと、なんのことかさっぱりなので、早速、基本構文を見ていきましょう!

qiita.rbvar
switch 制御式 {
case パターン 制御式:
制御式がパターン1にマッチし,かつ,条件式を満たす場合に実行される文

default:
制御式がいずれのパターンにもマッチしなかった場合に実行される文

次は、簡単な例です。

qiita.rbvar
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文のケースの実行を中断する文です。
簡単な例を見ていきましょう。

qiita.rbvar
let a = 1
switch a{
case 1: 
print("ログインに成功しました")
break
print("ログインに失敗しました")
default:
break
}
実行結果:ログインに成功しました

上記の例では、マッチするけーすcase1:内に2つのprint()関数が書かれていますが、2つ目のprint関数の前にbreak文が書かれているため、2つ目のprint関数は実行されません。

ラベル

ラベルはbreak文の制御対象を指定するための仕組みです。
switch文が入れ子になっている場合など、break文の対象となるswitch文を明示する必要があるケースで利用します。

入れ子・・・プログラミング用語で、あるモノの中にそれと同じモノを入れた構造という意味。

基本構造を見ていきましょう!

qiita.rbvar
ラベル名: switch文
break ラベル名

では、今度は、ラベルが必要となる例を見ていきましょう。

qiita.rbvar
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"に変更してみます。

qiita.rbvar
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文のケースの実行を終了し、次のケースを実行する制御構文です。

qiita.rbvar
let a = 1
switch a{
case 1: 
print("ログインに成功しました")
fallthrough
case 2:
print("ログインに失敗しました")
default:
print("default")
}

実行結果:
ログインに成功しました
ログインに失敗しました

上記の例では、fallthrough文によって、実行が次のケースであるcase2に移ります。したがって、case1とcase2が出力されます。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1