Swiftは3.x系になってから、for文の従来のC言語スタイルの書き方が削除されました。
この記事ではfor文、for-in文について、
・Swift3での変更点
・for文、for-in文の基本的な使い方
などの基本的な解説から、
・配列の要素分ループする方法
・Dictionary(ディクショナリ)型のループ
・String型のループ
などの応用的な使い方についても解説していきます。
ここでは、Swift3.0からの新しいfor文、for-in文の書き方についてまとめていますので、ぜひ参考にしてくださいね!
※この記事ではSwift3.1を使用しています。
for文、for-in文の基本的な使い方
for文とは条件が真の場合に処理を繰り返すループ処理となります。
主に指定した回数分ループで処理を繰り返したときに使用します。
Swiftではfor文では、Swift3.0でC言語のスタイルの記述方式が削除されました。
そのため、以下のようなfor文はSwift3.0より使用できなくなります。
Swfit2.0のfor文:
for var i = 0; i < 5; i++ { print("i: \(i)") }
同様の記述を行うにはfor-in文を使用する必要があります。
昇順ループ
先述した従来のようにC言語スタイルのようにfor文を記述する場合はfor-in文を使用して、以下のように記述します。
for i in 0..<5 { print("i: \(i)") }
実行結果:
i: 0 i: 1 i: 2 i: 3 i: 4
今までの標準的なfor文の書き方に慣れていると、馴染みが薄い書き方となってしまいますが、「for i in 0..<5 」の書き方で同様の処理が可能であることを覚えておきましょう!
降順ループ
降順でループするにはreversedを使用します。
for i in (0 ..< 5).reversed() { print("i: \(i)") }
実行結果:
i: 4 i: 3 i: 2 i: 1 i: 0
配列の要素分ループする
配列の要素数分ループするには、配列に対してcountを使用してループするのがSwift2までの書き方でした。
しかし、さきほど説明したように以下ようなC言語スタイルでの記述方式が削除されたため、countを使用することはできません。
let fruits = ["apple", "orange", "melon", "banana"] for var i = 0; i < fruits.count; i++ { if (i % 2) != 0 { print("\(fruits[i])") } }
Swift3.0でこのサンプルプログラムを実行すると、以下のようなエラーとなります。
error: C-style for statement has been removed in Swift 3 for var i = 0; i < fruits.count; i++ {
そのため、配列もfor-in文を使用して以下のように記述します。
let fruits = ["apple", "orange", "melon", "banana"] for value in fruits { print("\(value)") }
実行結果:
apple orange melon banana
また、enumeratedとstrideを使用して配列をループする方法もあります。
enumeratedで配列のループ
enumeratedを使用すると配列のindexを取得することができます。
書き方:
for (index番号, 値) in 配列.enumerated()
enumeratedを指定すれば、index番号に0からの番号が入り、値にはindex番号に対応した値が入ります。
let fruits = ["apple", "orange", "melon", "banana"] for (index, value) in fruits.enumerated() { print("\(value)") }
実行結果:
apple orange melon banana
strideで配列のループ
for-in文で配列をループするには、strideを使用する方法もあります。
書き方:
for i in stride(from: 開始位置, to: 終了位置, by: 間隔)
strideを使用すれば開始位置、終了位置、間隔が設定できますので、配列のindex番号0,3.5のように間隔を開けて値を取得することもできます。
let fruits = ["apple", "orange", "melon", "banana"] for i in stride(from: 0, to: fruits.count, by: 1) { print("\(fruits[i])") }
実行結果:
apple orange melon banana
Dictionary(ディクショナリ)型のループ
Dictionary(ディクショナリ)とはキーと値をセットにした配列で、PHPの連想配列のようなもです。
キーに紐づく値をセットできるため、ディクショナリ(辞書)とも言います。
以下にDictionary型のキーと値をfor-in文で取得するサンプルプログラムを紹介します。
let fruits = ["apple": 100, "orange": 80, "melon": 700, "banana": 150, "pineapple": 450] for (key,value) in fruits { print("\(key)は\(value)円です。") }
実行結果:
appleは100円です。 bananaは150円です。 melonは700円です。 pineappleは450円です。 orangeは80円です。
String型のループ
for-in文を使用すれば、「文字列.characters」でString型の文字列を1文字ずつ取り出すことが可能です。
文字列を1文字ずつ取り出す方法を以下に記述します。
let str = "Samurai" for char in str.characters { print(char) }
S a m u r a i
まとめ
ここではSwift3.x系のfor文、for-in文に関して、
・Swift3での変更点
・for文、for-in文の基本的な使い方
・配列の要素分ループする方法
・Dictionary(ディクショナリ)型のループ
・String型のループ
などについて解説しました。
for文の言語使用がSwift3.0にバージョンアップしてから大きく代わりました。
しかし、新しい書き方になれてくると、今までのfor文の書き方が冗長であることもわかります。
もし、for文、for-in文の書き方を忘れてしまったら、この記事を思い出してくださいね!