Swift の Array(配列)- ループ・map・filter
ここでは Swift の Array(配列)のループ方法と、filter・map メソッドの使い方についてご説明します。
Swift の Array(配列)をループする
Swift の Array(配列)をループするには、何通りか方法があります。
一番ベーシックな方法は for-in ループを使う方法です。
let names = ["Tanaka", "Suzuki", "Sato", "Yamada"]
for name in names {
print(name)
}
実行結果は次のようになり、要素が前から順番に print されています。
Tanaka
Suzuki
Sato
Yamada
forEach() メソッドを使っても同じように、名前を print することができます。
let names = ["Tanaka", "Suzuki", "Sato", "Yamada"]
names.forEach { name in
print(name)
}
実行結果は次のようになり、先ほど同様に要素が前から順番に print されています。
Tanaka
Suzuki
Sato
Yamada
for-in ループとの違いは forEach() では break や continue が使えないことなどがあげられます。
ループ処理の途中で何かの条件で break、continue、return したいような時は for-in ループを使ってください。
ループで処理をする時に、要素のインデックスも取得したい時は enumerated() を使って、次のようにループできます。
let names = ["Tanaka", "Suzuki", "Sato", "Yamada"]
for (index, name) in names.enumerated() {
print("\(index): \(name)")
}
実行結果は次のようになり、要素のインデックスも取得できています。
0: Tanaka
1: Suzuki
2: Sato
3: Yamada
map() で要素を変換した配列を生成する
Swift の Array(配列)の map() メソッドを使って、要素を変換した配列を生成することができます。
例えば、名前を全部大文字に変換した配列を生成したい時は次のようにできます。
let names = ["Tanaka", "Suzuki", "Sato", "Yamada"]
let names_upper = names.map { $0.uppercased() }
print(names)
print(names_upper)
実行結果は次のようになり、names_upper 配列の要素は全て大文字になっています。
["Tanaka", "Suzuki", "Sato", "Yamada"]
["TANAKA", "SUZUKI", "SATO", "YAMADA"]
map() を使って、構造体やクラスオブジェクトの配列から特定のプロパティを取り出して配列にすることもできます。
例えば、次のような Student という構造体を要素として持つ students 配列から、studentsNames という student の name だけを持つ配列を生成するには次のようにできます。
struct Student {
var name: String
var age: Int
}
let students = [
Student(name: "Tanaka", age: 10),
Student(name: "Suzuki", age: 9),
Student(name: "Sato", age: 8),
Student(name: "Yamada", age: 10),
Student(name: "Tanaka", age: 11)
]
let studentsNames = students.map({ (student) -> String in
return student.name
})
print(studentsNames)
実行結果は次のようになり、名前だけの配列が生成されました。
["Tanaka", "Suzuki", "Sato", "Yamada", "Tanaka"]
このように、map() は現在の配列を変換して、新しい配列を生成したい時に便利です。
filter() で要素をフィルターした配列を生成する
Swift の filter() メソッドを使って、指定した条件を満たす要素だけを含んだ配列を生成することができます。
例えば、次のような names 配列の中で、S で始まる name の要素を含む新しい配列を生成するには次のようにできます。
let names = ["Tanaka", "Suzuki", "Sato", "Yamada"]
let s_names = names.filter { (name) in
return name.hasPrefix("S")
}
print(names)
print(s_names)
実行結果は次のようになり、s_names 配列には S から始まる名前だけが要素として入っていますね。
["Tanaka", "Suzuki", "Sato", "Yamada"]
["Suzuki", "Sato"]
以上、Swift の Array(配列)のループ方法と、filter・map メソッドの使い方についてご説明しました。