for, whileなどを入れ子で使う場合に、breakなどを使うと一番内側にあるスコープからしか抜けだせない。
それを一気に抜け出すためには、ラベルをつけることで明示的にループから抜けることができるよ。
(ただし、ネストが深くなるのは一般的にはよろしくないので、メソッド化を行うのもしっかりと視野に入れておこう)
for文でラベルを使う
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
var i = 0 var j = 0 hoge: for i in 0...2 { print("i: \(i)") fuga: for j in 10...11 { print("j: \(j)") break fuga // breakでも同じ } } // i: 0 // j: 10 // i: 1 // j: 10 // i: 2 // j: 10 |
こんな感じで名前をつけてあげると、そのループから明示的に抜け出すことができるよ。
今回は元々一番内側だから処理的には今までと変わらないので以下を見てみよう。
for文で外側のループへ抜け出す
1 2 3 4 5 6 7 8 9 10 11 |
var i = 0 var j = 0 hoge: for i in 0...2 { print("i: \(i)") fuga: for j in 10...11 { print("j: \(j)") break hoge } } // i: 0 // j: 10 |
外側のhogeのループから外に抜け出しているので、printがどちらも一度しか動いていないのがわかると思う。
以下、同じようにwhileだと…
whileで外側のループへ抜け出す
1 2 3 4 5 6 7 8 9 10 11 12 13 |
var i = 0 var j = 10 hoge: while i < 2 { i += 1 print("i: \(i)") fuga: while j >= 10 && j <= 12 { j += 1 print("j: \(j)") break hoge } } // i: 1 // j: 11 |
こんな感じで抜け出せるよ。
今回は紹介しないけど、Switchでもラベルはつけれるよ。