Swift書いてて、ループ文をreturnで抜けたとき、どこまで抜けるのかがよくわからなくなったので、サンプルコードを書いて確かめてみることにしました。
サンプル
struct Dice {
func roll(from startIndex: Int, to endIndex: Int) {
for i in (startIndex...endIndex) {
guard i <= 6 else { return } //<-ここをreturn/break/continueそれぞれ試す
print(i)
}
print("サイコロの目は6までです")
}
}
もしreturn = breakなら、"サイコロの目は6までです"まで出力されるはずですね。
まずはbreakから。
break
Dice().roll(form: 1, to: 7)
これで挙動を試しました。
1
2
3
4
5
6
サイコロの目は6までです
想定どおりですね。
continue
このサンプルだとcotinueとbreakの差がわかりづらいので、guard i == 6 else { continue }
にして試します。
6
サイコロの目は6までです
はい。
早期退出してもループ文は次の要素に対して継続するので、6のときだけprint出力が実行されます。
return
んで、returnなんですが……
1
2
3
4
5
6
となりました。
よく考えたら当然で、returnで抜けるスコープはメソッドであって、ループ文から抜けるわけじゃないんですね。
(……と説明されると当たり前じゃん、と思ってしまうんですけど、実際にコード書いてると、いつの間にかbreak≒returnみたいな感覚になってました)
ちなみに
実際に使ったことはないんですけど、Swiftのbreak/continueにはラベルというのがつけられるそうで、
struct Dice {
func roll(form startIndex: Int, to endIndex: Int) {
parent: for _ in (startIndex...endIndex) {
for i in (startIndex...endIndex) {
guard i <= 6 else { break parent }
print(i)
}
print("サイコロの目は6までです")
}
}
}
という風に、親スコープのループを抜けることができます。
この例だと、普通のbreakだと、上記のbreakを使ったときの出力例が7回出るんですけど、
ラベルをつけてあげると、1〜6を出力した時点で、親ループを抜けます。
使いどころはありそうなんですけど、実際に使ったことはないですね。