🐦

Swiftのbreak, continue (とfallthrough)の挙動について

2020/12/05に公開

はじめに

基本的な部分ですが,若干ハマりかけたので備忘録も兼ねて一度まとめておこうと思います.

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