パソナについて
記事検索

【Swift】for in や forEachの書き方 - strideやenumeratedも併せて解説

Swift特有のfor-in文の基本的な書き方から、forEach の記述方法、strideやenumeratedなどの使い方や、さらに状況によって使い分けができる使用例まで、for-in文について詳しく解説していきます。

【Swift】for in や forEachの書き方 - strideやenumeratedも併せて解説

Swift特有のfor-in文の基本的な書き方から、forEach の記述方法、strideやenumeratedなどの使い方や、さらに状況によって使い分けができる使用例まで、for-in文について詳しく解説していきます。

スキルアップ

2023/02/22 UP

任意の処理を「繰り返したい」場合に使用するループの命令文にはいくつか種類がありますが、その中でも基本となるものに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文は使えないので注意!

Swiftでは見慣れたfor文は使えないので注意!

Swift3以降ではfor文の書き方が大幅に変更されました。他の言語でもよく見るC言語由来のfor文は使用できなくなっている点に注意しましょう。一方で、for-in文はSwift2以前のfor文よりも簡潔で扱いやすい条件文の記述方法になっているため、慣れれば書きやすさを感じるでしょう。

for-inの書き方を覚え、条件文に使用できるメソッドに慣れることで、より便利なループ処理が習得できますので、この機会に覚えてしまうことをおすすめします。