【Swift】ラベルを使って多重ループや多重スコープから一気に抜ける。(Swift 2.1、XCode 7.2)

2020年6月16日

ラベルとは

ラベルとは、制御文につける名前のことであり、ラベルを利用すれば多重ループや多重スコープの中から一気に抜けだしたり、処理をスキップできるようになる。

ラベルは以下のように定義する。

 

ループでラベルを利用する

例えば、以下のコードのような2重ループがあったとする。フラグの値がfalseだったら2重ループを抜けるもので、内側のループ内でフラグ判定が行われてbreakでループを抜けたら、外側のループでもフラグ判定を行いbreakでループを抜けるという2回の判定処理を書かなくてはならない。

ループを深くするコーディングの書き方自体が好ましく無いという考えもあるが、このように、ループごとにループ継続判定を行わなければならないのは冗長だ。

 

そこで利用されるのがラベルだ。以下のコードのように制御文(例ではfor)の先頭にラベルをつける。そして、ループを抜けたい箇所で「break ラベル名」と記述するとラベルをつけた制御文を一気に抜けることができる。コードがスッキリした。

 

ループを抜けるのではなく、指定したループの先頭に移動してループを継続したい場合はcontinueを使う。以下のコードはフラグがtrueの場合はループの先頭に移動して処理を再開する例。実行結果を見ると、ループ内のcontinue以降の処理が行われなかったことが分かる。

なお、continueで移動したときはループカウンタ(例ではiとk)はインクリメントされる。

条件分岐でラベルを利用する

ラベルはループ処理だけでなく、ifやswitchの条件分岐でも使える。以下のコードは2重のif文を「break ラベル」で抜ける例。breakを発行したあとのif文の中の処理が行われていないことが分かる。

 

ちなみに、ループの無いところでラベルを指定しないbreakを使うことはできない。以下のコードはコンパイルエラーになる。

 

処理ブロックでラベルを利用する

ループや条件判定のブロックの中ではなく、ひとかたまりの処理を一気に抜けたいときがある。そういうときは通常、ひとかたまりを関数にするのが常套手段だが、以下のコードのようにdoブロックを使って処理を抜けることができる。

 

ちなみにif文やswitch文と同様に、doブロックの中でもラベルを指定しないbreakを使うことはできない。