【Swift】for in や forEachの書き方 - strideやenumeratedも併せて解説
Swift特有のfor-in文の基本的な書き方から、forEach の記述方法、strideやenumeratedなどの使い方や、さらに状況によって使い分けができる使用例まで、for-in文について詳しく解説していきます。
Swift特有のfor-in文の基本的な書き方から、forEach の記述方法、strideやenumeratedなどの使い方や、さらに状況によって使い分けができる使用例まで、for-in文について詳しく解説していきます。
スキルアップ
2023/02/22 UP
- プログラミング
- SE資格・スキル
- Swift
任意の処理を「繰り返したい」場合に使用するループの命令文にはいくつか種類がありますが、その中でも基本となるものにfor文が挙げられます。
しかしSwiftでは、この一般的なfor文はなく、代わりにfor-in文を使用するようになっています。for文を使い慣れていると違和感を覚えるfor-in文ですが、簡単な繰り返し処理では必要文字数が少なくなるので、慣れるとコーディングにかかる時間も短縮され便利です。
今回はSwift特有のfor-in文の基本的な書き方から、forEach の記述方法、strideやenumeratedなどの使い方や、さらに状況によって使い分けができる使用例まで、for-in文について詳しく解説していきます。
Swiftのfor文とは
Swift3以降ではC言語を由来とする、他の言語でもよく見る型のfor文は使用できません。 for文はObjective-Cでも使用頻度の高い構文ですが、Swift3以降ではforの処理は必ずfor-in文で記述することになっています。そのため、現在は次のような構文が使えなくなりました。
//Swift2以前 for var i = 0; i < 5; i++ { print(i) }
一般的なfor文が使えない代わりに現在のSwiftでは、次のようなfor-inの書き方を用います。
//Swift3以降 for i in 0..<5 { print(i) }
Swift2以前の書き方では、条件式内で"変数を宣言";"繰り返しの上限を決定";"繰り返しの法則式"という順で記述する必要がありました。しかし、現在のSwiftでは、条件式内には"繰り返す最小単位 ..< 繰り返し上限"のみの記述になり、簡潔に書けるようになりました。そのため、Swiftのfor-in文は、以前のfor文と比較すると、条件式の書き方が簡素になっています。
Swiftは2014年に登場したばかりで、2020年12月現在のバージョンは5.3と比較的新しい言語であり、Apple社内外からの提案によってバージョンアップ時に追加・削除される機能が検討・採択されます。そのため、for文に限らず、より良いプログラミング言語を目指して、今後も大きな仕様変更が行なわれる可能性があります。
Swiftでのfor文の書き方
Swiftでは、一般的なfor文の条件式とは違い、for _ in 0 ..< [繰り返したい回数]のみの記述で、単純な繰り返しの命令が書けます。ここでは、実際にSwiftではfor文をどのように記述するのか、サンプルコードを見ながら理解を進めていきましょう。
for in で書く
基本形となるfor-in文の記述方法です。条件文の基本的な形は"繰り返す最小単位 ..< 繰り返し上限"なので、それに則ってサンプルでも「for i in 0 ..<5」の条件を設定しています。
for i in 0 ..< 5{ print(i) }
このコードを実行すると、プログラムをビルドしたタイミングで条件に沿って処理がループし、0から4の5つの数字が出力されます。降順で処理する場合は、reversedを使用して以下のように記述します。
for i in (0 ..< 5) .reversed() { print(i) }
forEachで書く
forEachは配列や辞書などを繰り返す場合に使用します。
for-in文とforEach文には大きな違いがあります。for-in文の場合はbreakやreturnで処理を終了したり抜けることができますが、forEach文ではbreakやreturnなどで処理を抜けることができません。
forEach文の基本的な書き方は、[配列の名前].forEach{処理}です。サンプルではnumbersという配列に対し、配列内の要素を順番に出力しています。
var numbers = [1,2,3,4,5] //number内の1~5を順に出力 numbers.forEach{ //$0が要素 print($0) }
配列や辞書の繰り返しは、for-in文でも処理できます。for-in文で配列内の要素を順に出力する場合、次のように記述します。
var numbers = [1,2,3,4,5] for num in numbers { print(num) }
strideの使い方
strideは、from〜toで設定した値を、byで指定した間隔で刻み、値を作る関数です。strideを条件文に使用することで、for-in文やforEach文の処理を一定間隔で行なえます。
次のサンプルでは0から10までの値を、2刻みで処理して結果を出力させています。
//from...初期値 to...終了値 by...増分 for i in stride(from: 0, to: 10, by: 2) { print(i) }
10は終了値なので出力結果に反映されていませんが、終了値を結果に反映したい場合は終了条件のtoをthroughに変更します。
なお、増分条件には小数点を使用することで、より細かな設定が可能です。また、増分条件をマイナスにすることで逆順処理になります。
enumeratedの使い方
enumeratedは配列や辞書の要素を、([番号],[値])という表示形式で取り出す関数です。以下のサンプルでは、配列の先頭から順番に要素のペアを抜き出して出力しています。
var texts : [String] = ["マグロ","サンマ","カツオ"] for (i,texts) in texts.enumerated() { print(i,texts) }
breakの使い方
breakはその場でループ処理を終了して抜ける命令です。特定の処理を終えた場合のみ、ループの条件文を無視して処理を抜けたい時などに使用します。
次のサンプルでは、2を出力する際にifで条件を分岐させ、breakによってループを終了しています。よってこのサンプルの場合、1だけが出力されます。
for i in 1 ..< 10 { if i % 2 == 0 { break } print(i) }
continueの使い方
continueは次のループ処理の先頭に飛ばす命令です。サンプルでは、ifで条件を分岐させ、2で割り切れる場合は後の処理を行なわず、ループ処理の先頭へ戻しています。そのため、出力されるのは1〜9までの奇数(1,3,5,9)のみになります。
for i in 1 ..< 10 { if i % 2 == 0 { continue } print(i) }
key valueを取得する方法
key valueは配列や辞書のkeyに対応するvalue(値)を取得する命令です。条件文に「for (key,value) in 配列名または辞書名」と記述することで、格納されているデータを呼び出せます。
サンプルではfoodranksという辞書に対し、keyとvalueを取得して「好きな食べ物ランキング」という結果を出力しています。
var foodranks = ["1位":"カレー","2位":"ハンバーグ","3位":"ラーメン"] for (key,value) in foodranks { print("好きな食べ物ランキング: (key) (value)") }
Swiftでは見慣れたfor文は使えないので注意!
Swift3以降ではfor文の書き方が大幅に変更されました。他の言語でもよく見るC言語由来のfor文は使用できなくなっている点に注意しましょう。一方で、for-in文はSwift2以前のfor文よりも簡潔で扱いやすい条件文の記述方法になっているため、慣れれば書きやすさを感じるでしょう。
for-inの書き方を覚え、条件文に使用できるメソッドに慣れることで、より便利なループ処理が習得できますので、この機会に覚えてしまうことをおすすめします。