🐦
Swiftのbreak, continue (とfallthrough)の挙動について
はじめに
基本的な部分ですが,若干ハマりかけたので備忘録も兼ねて一度まとめておこうと思います.
break
自身が含まれるループ文やswitch文全体の処理をその時点で終了し,そのブロックの閉じ括弧(}
)の直後に処理の流れを移します.
例
for i in 1...10 {
if i % 2 == 0 {
break
}
print(i)
}
print("END")
//以下出力
1
END
continue
ループ文の中で,continue文が実行された場合,その周回のループをその時点で完了したものとし,そのループ文の次の周回の処理を続けます.
例
for i in 1...10 {
if i % 2 == 0 {
print("\(i): even")
continue
}
print(i)
}
print("END")
//以下出力
1
2: even
3
4: even
5
6: even
7
8: even
9
10: even
END
fallthrough
switch文の中で各ケースの処理の実行が終了し,fallthroughを実行すると直下のケースの処理を実行することができます.(今回ドキュメントを漁る中で初めて存在を知りました.)
C言語やObjective-Cではfallthroughの挙動がデフォルトだったようで,その仕様をSwiftで再現するために用いるものだそうです.
Swift の switch 文は、各ケースの最下部を通過して次のケースにフォールスルーしません。そうではなく、最初に一致したケースを完了後すぐに switch 文全体の実行を終了します。対照的に、C でフォールスルーを防ぐためには、すべての
switch
ケースの最後に明示的なbreak
文を置く必要があります。デフォルトでフォールスルーすることがない Swift のswitch
文は、C と比較して簡潔で予測しやすく、誤って複数のswitch
ケースを実行してしまうことを防ぎます。C スタイルのフォールスルーが必要な場合には、個別に
fallthrough
キーワードでこの動作にすることができます。次の例では、数値の説明テキストをfallthrough
を使って作成しています。
例
for i in 1...10 {
switch i % 2 {
case 0:
print("\(i): even")
fallthrough
case 1:
print("\(i): odd")
fallthrough
default:
print("\(i): number")
}
}
//以下出力
1: odd
1: number
2: even
2: odd
2: number
3: odd
3: number
4: even
4: odd
4: number
5: odd
5: number
6: even
6: odd
6: number
7: odd
7: number
8: even
8: odd
8: number
9: odd
9: number
10: even
10: odd
10: number
Discussion