はじめに
今回は、多重ループの内側から一気に抜け出す際に役立つ、ラベル付きループ文の書き方を紹介します。
ラベル付きループ文とは?
多重ループを構成するwhile文やfor文などにラベルを付けて置き、break文とcontinue文を使用する際、どのループから抜け出すのか、またはどのループの実行を継続するのかを、ラベルで指定する書き方です。
Swiftではあまり使われない方法ですが、場面によってはすごく効果的な手法になります。
具体的な書き方
ラベルはwhile文やfor文の前に、識別子と「:」を置きます。
break文ではラベルの付けられたループから抜け出し、そのループの次の文の実行に移ります。
continue文はラベルの付けられたループの残りの部分の実行をスキップして、次の繰り返しが可能かどうか、条件の判定に移ります。
実際の書き方を以下に示します。
loop1: while 条件~~ {
loop2: while 条件~~{
while 条件~~ {
break loop1
continue loop1
break loop2
continue loop2
}
}
}
ラベル付きループ文の実践例
実際にラベル付きループ文を使って書いてみた、うるう年判定のコード例を紹介します。
leap: if year % 4 == 0 {
if year % 100 == 0 {
if year % 400 == 0 {
print("\(year)年は400で割り切れるのでうるう年です。")
break leap
}
print("\(year)年は100で割り切れるのでうるう年ではありません。")
break leap
}
print("\(year)年は4で割り切れるのでうるう年です。")
}else {
print("\(year)年は4で割り切れないのでうるう年ではありません。")
}
変数yearに様々な値を代入してLeapyear.swiftを実行すると、次のような出力が得られます。
1996年は4で割り切れるのでうるう年です。 // year = 1996
2000年は400で割り切れるのでうるう年です。 // year = 2000
2017年は4で割り切れないのでうるう年ではありません。 // year = 2017
2100年は100で割り切れるのでうるう年ではありません。 // year = 2100
yearが2000の時、400で割り切れることがわかると、printを実行してからbreakで直ちにif文から抜け出すので、その下にあるprintは実行しません。
if文に対するbreakは必ずラベルが必要です。ラベルがなければ通常のループやswitch文からの脱出と解釈されます。また、if文もswitch文もループ文ではないので、continueでラベルを指定することはできません。
終わりに
今回はラベル付きループ文について解説しました。必要になる場面は限られますが、うまく使えれば効果を発揮するので、ぜひ頭の片隅に置いておいてください。