Codable Tech Blog

iPhoneアプリケーション開発と AWS(Amazon Web Service)活用に関する記事を配信

繰り返し文(for-in文、while文)

プログラムを書いていると同じ処理を何度も実行することがよくあります。この時、コピペで同じコードを書くのではなく、繰り返し処理を用いてコードを記述することで簡潔に繰り返し処理を実現することができます。繰り返し処理には繰り返し回数が決まっている場合と繰り返し回数が不定の場合があります。一般的に繰り返し回数が決まっている場合はfor-in文を用います。繰り返し回数が不定の場合にはwhile文を用います。

回数の決まった繰り返し(for-in文)

for-in文の構文は以下のようになります。

for 要素を格納する定数 in 複数の要素を保持する変数or定数 {
    文
}

for-in文はin句に記述された変数の要素を全て数え上げるまで繰り返される処理になります。1回のループで1つの要素を取り出し、for文の「要素を格納する定数」に代入します。そして、全ての要素が数え上げるまで処理を繰り返していきます。なお、「要素を格納する定数」は明示的にletを指定しなくても、for-inループの中で暗黙的に定数として扱うように処理されます。
以降では代表的なfor-in文の使い方を例示していきます。

範囲演算子とfor-in文(規定回数分だけ繰り返す)

繰り返し処理のパターンとして、規定回数だけ繰り返す処理がよくでてきます。for-in文では範囲演算子(...)を利用して特定の回数だけ繰り返す処理を記述することも可能です。
例えば、5回だけ処理を繰り返すfor-in文は次のようになります。

はじめのループではiに1が代入されます。そのあと、ブロック内のprintが実行されます。printが実行されると再度、iの値が更新され、iの値は2になります。このプロセスを範囲の終端に到達するまで繰り返します。もし、カウンタ変数であるiの値が必要なければ「 _ 」を利用することで無視することもできます。次の例は_を利用してカウンタ変数を無視した例です。

for-in文の例(Array)

配列から要素を一つ一つ抽出する処理はプログラムでとてもよく利用されます。Int型の値を5つ格納した配列arrayを用意し、arrayに格納されている全ての要素を出力するfor-in文の例は次のようになります。

arrayに格納されている要素がループのたびにelmに代入されます。この例ではelmに代入された値をprintで出力しています。注意してほしいのはfor-in文では一つ一つの要素は定数に格納しています。このため、もし、for-inブロックの中でelmの値を変更しようとすると、定数は値を変更できないのでコンパイルエラーになります。

for-in文の例(Dictionary)

辞書をキーと値のペアで列挙することが可能です。辞書の各要素を列挙する場合、(キー,値)のタプルを「要素を格納する定数」として用意する必要があります。下記の例では、テストの得点を管理する辞書testsを用意し、列挙しています。要素列挙時のタプルとしてキーの定数にcourseTitle、値の定数にscoreを用意しています。

辞書は並び順を持たないため、挿入された順序で要素が列挙されないことに注意してください。

for-in文の例(String)

for-in文ではString型の要素を一つ一つ抜き出すことも可能です。String型に格納されている文字列の一つ一つ要素はCharacter型です。このため、取り出される値の型はCharacter型になります。
文字列「test」を格納したString型から一つ一つの文字を取得するfor-in文は次のようになります。

回数が不定の繰り返し(while文)

もし、繰り返し処理を始める前に何回繰り返せばよいかわからないときにwhile文を利用するとよいでしょう。while文は始めに条件式をチェックします。その結果、条件を満たしていれば繰り返し処理を実行します。while文の構文は次のようになります。

while 条件式 {
    文
}

while文の例

値が1000を超えるまで2の乗数の値を出力しつづけるwhile文の例は次のようになります。

この例ではanswerの値が1000より小さい間はwhileブロックの中の処理を繰り返します。規定回数だけ繰り返し処理を記述するのはfor-in文が便利ですが、今回の例のように何回繰り返せばその条件を満たすのかわからない時(今回の例では値が1000を超えるのはループの何回目かが不明)にwhile文を用いるとよいでしょう。

repeat-while文

swiftではdo-while文と呼ばれる繰り返し構文も提供しています。while文は繰り返し処理が始まる前に条件式をチェックして条件を満たしていれば繰り返し処理を実行します。一方、do-while文はまず、繰り返し処理を実行した後、条件式をチェックして、繰り返し処理を継続するか判断します。必ず1回は繰り返し処理を実行したい場合はdo-while文を利用するとよいでしょう。do-while文の構文は次のようになります。

repeat {
    文
} while 条件式

repeat-while文の例

変数numの値が0より大きい間、numの値をコンソールに出力し続けるプログラムをrepeat-whileを利用して作成した例は以下のようになります。

この例では、numがどんな値であっても最低、一度はnumの値を出力したかったのでrepeat-while文を利用しています。repeat-while文では条件判定の前にrepeatブロックに記述されている処理が実行されますので、最低でも1回はrepeatブロックの中の処理が実行されます。

for-in文とwhile文の交換

for-in文とwhile文は置き換えが可能であり、どちらを利用しても同じ繰り返し処理を記述できます。例えばfor-in文で所定回数繰り返す処理をwhile文を利用して以下の記述のように記述できます。

このようにどちらを用いても同じ記述できるですが、プログラミングの慣習として所定回数の繰り返し処理を記述する場合はfor文、繰り返し回数が不明の場合はwhile文というルールがあります。このルールの沿ってプログラムを書いてあげることで他の人が貴方のコードを読むときにプログラムの意図を把握しやすくなりますので、なるべくルールに従った形でプログラムを記述していきましょう。



for文はSwift3で廃止となりました。文章自体はこのまま残しておきますが、Swift3でプログラミングするときは利用できませんのでご注意ください。

回数の決まった繰り返し(for文)

繰り返し回数が決まっている場合にはfor文を用います。for文の構文は以下のようになります。

for 初期化処理; 条件式; 増分処理 {
    文
}

繰り返し処理の動作

繰り返し処理の動作は以下の3ステップの動作になります。

  1. 繰り返し処理の最初に一度だけ初期化処理が実行されます。ここで繰り返し処理のために必要な変数や定数をセットアップします。初期化処理ではカウンタ変数と呼ばれるループ回数を数え上げる変数を初期化するのが一般的です。
  2. 条件式が評価されます。条件式はカウンタ変数がある値より小さいかどうかを確認するパターンが多いです。もし、条件がfalseの場合、繰り返し処理を終了し、forブロックの外( }以降 )のコードが実行されます。もし、条件がtrueの場合はブロック({ から } の間)の文が実行され、繰り返し処理を継続します。
  3. 2の処理が完了した後、カウンタ変数の増分処理の処理がおこなわれます。そして、再度、2の条件判定が行われます。

繰り返し処理の例

testという文字を3回、コンソールに出力するfor文は次のようにあります。

var i=0が初期化処理にあたります。変数iがカウンタ変数です、このカウンタ変数を利用して所定の回数だけ繰り返す処理を記述しています。
i < 3が繰り返し処理をいつまで続けるかを規定した条件式になります。この例ではカウンタ変数iが3より小さい間は処理を繰り返す条件式を設定しています。++iはカウンタ変数の増分処理になります。この増分処理はiの値を+1する処理になります。この例ではiの値が0、1、2の時、for文のブロックの中が処理されますので3回、for文のブロックの文が実行されます。そしてiの値が3になると条件式がfalseになるのでfor文を抜けます。

カウンタ変数のスコープ

for文の初期化処理で宣言した変数はforループの中でだけ有効です。このため、もし、for文の外でも宣言した変数を利用したければループ処理の前に初期化変数を宣言しておく必要があります。

回数の決まった繰り返し処理でよく利用するパターンとして配列の要素を全て取得するというものがあります。この処理をfor文で記述すると以下のようになります。