Posted at

【Swift】プログラムの制御を写す文


プログラムの制御を移す文

今回はプログラムの処理・制御を次のフェーズに移す文を3つ紹介します。


fallthrough文

fallthrough文はswitch文で現在のcaseの処理を終了した後に、その次のケースの処理を実行させる文です。

それではサンプルコードを見ていきましょう。

let a = 1

switch a {
case 1:
print("case 1")
//ここで次の処理を実行させるよう制御しています
fallthrough
case 2:
print("case2")
default:
print("default")
}

//実行結果
case1
case2

上記のコードを見るとswitch文の条件はa(1)のはずなのに、実行結果はcase2までが出力されています。

これがfallthrough文の特性で、先ほども説明した通り現在のcaseの後のcaseも処理するという機能です。

これはもともとC言語に由来した機能で、 Cではデフォルトの挙動で後続のケースが実行されるようになっています。

しかしSwiftではプログラムの予期せぬ実行を避けるため、それをしないような仕様になっているます。そのため、このfallthrough文がそのCのデフォルト機能の代用機能を担っています。


break文

break文は、switch文やfor文などの処理の実行を中断することができます。

それでは以下のサンプルコードを見てください。

var containsTwo = false

let array = [1, 2, 3]

for element in array {
if element == 2 {
containsTwo = true
break
}
print("element: \(element)")
}
print("containsTwo: \(containsTwo)")

//実行結果
element: 1
containsTwo: true

以上の処理を見たら分かるように、for文の処理で2が回ってきた回にbreakがかかり、結果的に1しか出力されない結果になりました。


continue文

continue文は、continue文以降の処理をスキップするし次の回に回す機能を持っています。

var odds = [Int]()

let array = [1, 2, 3]

for element in array {
if element % 2 = 1 {
odds.append(element)
continue
}
print("even: \(element)")
}

print("odds: \(odds)")

//実行結果
even: 2
odds: [1, 3]

上記の処理のようにcontinue文を使用することで、数値が奇数の回は次の処理の偶数をプリントする処理を行なっていません。

このようにcontinueはfor文などでその回の残りの処理をスキップして、次の回に回す処理です。


ラベル

ラベルはif文や、for文などで使うcotinue文・break文の制御の移動先を指定できます。

それでは、まずラベルを使わないパターンから見ていきましょう。

for element in [1, 2, 3] {

print("element: \(element)")

for nestedElement in [1, 2, 3] {
print("nestedElement: \(nestedElement)")
break
}
}

//実行結果
element: 1
nestedElement: 1
element: 2
nestedElement: 1
element: 3
nestedElement: 1

上記のパターンを見ると、2つ目のfor文でbreak文が記述されているため残りの2と3を出力する前に処理が終わり、結果1だけ出力されています。

次にラベルを使うパターンです。

label: for element in [1, 2, 3] {

print("element: \(element)")

for nestedElement in [1, 2, 3] {
print("nestedElement: \(nestedElement)")
break label
}
}

//実行結果
element: 1
nestedElement: 1

上記のコードを見るとbreakの後にlabelという記述があり、forの前にもlabelが記述されています。

この記述のおかげで、二つ目のfor文内のbreakの制御がlabelが付与されているfor文に渡され、結果1つ目のfor文が一回しか処理されず上記のような実行結果になりました。