【Swift】for文の使い方(Swift 2.1、XCode 7.2)
for文の使い方
for文とは、規則的な処理を繰り返す場合に使われる制御文である。プログラミングの世界では、処理を繰り返すことをループすると表現する。
他言語でも馴染みのあるfor文は以下になる。処理をする度にカウンタの値を確認し、継続条件を満たすあいだループし続ける。
1 2 3 4 |
for (カウンタ変数の初期化; ループの継続条件; ループ1回のカウンタ増減) { 処理 } |
以下のコードは、回数を出力するループを5回繰り返すサンプル
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
/* ** for文の使用例 */ //ループ回数を出力する for (var i = 1; i <= 5; i++) { print("\(i)回目"); } //実行結果 //1回目 //2回目 //3回目 //4回目 //5回目 |
以下のコードのように、for文の横の括弧は省略できる。しかし、括弧があった方が読みやすいと思う人が多いので省略しないほうが良い。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
/* ** for文の使用例 ** 括弧を省略する */ //ループ回数を出力する for var i = 1; i <= 5; i++ { print("\(i)回目"); } //実行結果 //1回目 //2回目 //3回目 //4回目 //5回目 |
for文の条件文には複数の変数や条件式を定義できる。
以下のコードは2つの変数を定義した例。変数iを1で初期化し、ループごとに値をインクリメントして5になるまでループする。
変数kはtrueで初期化し、変数iが2のときに変数kの値をfalseに変える処理をループ内で行っている。そのため、ループ2回目でkがfalseになることで「ループの継続条件」を満たさなくなり、ループが終了する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
/* ** for文の使用例 ** ループ条件を複数定義する。 */ //ループ回数を出力する for ( var i = 1, k = true; i <= 5 && k == true; i++ ){ print("\(i)回目"); if( i == 2 ){ k = false } } //実行結果 //1回目 //2回目 |
for-in文の使い方
for-in文はデータの集合から値を1つずつ取り出しながらループさせるときに使うが、範囲指定を使えばfor文と同じ処理をさせることができる。
「ループの継続条件」や「ループ1回のカウンタの増減」が複雑にならないのであれば、for文よりもfor-in文を使ったほうが見た目がスッキリしていて使いやすい。
1 2 3 4 5 6 7 8 9 10 |
//初期値をインクリメントしながら終了値になるまでループする for 変数 in 初期値 ... 終了値 { 処理 } //コレクションに含まれる要素の数だけループさせる for 変数 in コレクション { 処理 } |
以下のコードは、for-in文を使って回数を出力するループを5回繰り返す例。for文よりも見た目がシンプルで、何回ループするのかが直感的に分かりやすい。ループはこの書き方に慣れよう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
/* ** for-in文の使用例 */ //ループ回数を出力する for i in 1 ... 5 { print("\(i)回目") } //実行結果 //1回目 //2回目 //3回目 //4回目 //5回目 |
以下のコードは、配列から要素を1つずつ取り出して出力する。
1 2 3 4 5 6 7 8 9 10 |
/* ** for-in文の使用例 ** 配列の要素数ぶんループ */ var test1 = ["山田","田中","佐藤"] for i in test1 { print(i) } |
以下のコードは、辞書から要素を1つずつ取り出して出力する例。
辞書はキーと値のセットになっているので、キー用と値用の2つの変数に値を格納する。辞書のkeysプロパティを利用してキーのみのコレクション、valuesプロパティを利用して値のみのコレクションを取得する方法もある。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
/* ** for-in文の使用例 ** 辞書の要素数ぶんループ */ //key, valueをタプルで取得し出力する。 var test2 = ["A":"山田", "B":"田中", "C":"佐藤"] for (testkey, testvalue) in test2 { print(testkey) print(testvalue) } //実行結果 //C //佐藤 //B //田中 //A //山田 //辞書のkeysプロパティを利用すればkeyのコレクションだけにできる for testkey in test2.keys { print(testkey) } //実行結果 //C //B //A //辞書のvaluesプロパティを利用すればvalueのコレクションだけにできる for testvalue in test2.values { print(testvalue) } //実行結果 //佐藤 //田中 //山田 |
for-in文の後ろにはwhere句をつけることができる。where句の条件を満たす場合は変数に値がセットされてループ内の処理が行われる。where句の条件を満たさない場合は、その要素はスキップされ次の要素に進む。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
/* ** for-in文の注意事項 */ //配列の要素が"田中"以外の場合、ループ内の処理をする。 var test3 = ["山田", "田中", "佐藤"] for testvalue in test3 where testvalue != "田中" { print(testvalue) } //実行結果 //山田 //佐藤 |
for-in文の注意点について説明する。上記でコレクションから取り出した要素を格納するものを変数と言っているが、この変数の値はfor文の中で変更するこはできない。ループごとに値は書き換わるが、定数として扱われるのだ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
/* ** for-in文の注意事項 */ //コレクションの要素を格納した変数は値を変更することができない。 var test3 = ["山田", "田中", "佐藤"] for i in test3 { i = "大久保" print(i) } //実行結果 //error: cannot assign to value: 'i' is a 'let' constant |
ループを抜けたあとに要素を代入した変数を参照することは出来ない。ループ内だけで参照できる変数である。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
/* ** for-in文の注意事項 */ //配列の要素を格納した変数はループを抜けたあとは参照できない。 var test3 = ["山田", "田中", "佐藤"] for testvalue in test3 { print(testvalue) } print(testvalue) //実行結果 //error: use of unresolved identifier 'testvalue' |