Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
配列.reduce() / forEach() / enumerated()
Swiftの配列では『reduce(_:_:)』で要素を集約し、『forEach()』で全要素を列挙できます。『enumerated()』でインデックスと要素を同時に取得し、『zip()』で2つの配列を対応させます。
構文
// 集約(初期値と演算クロージャを指定)
配列.reduce(初期値) { 累積値, 要素 in
return 新しい累積値
}
配列.reduce(0, +) // 演算子で簡潔に
// 全要素の処理(戻り値なし)
配列.forEach { 要素 in
// 処理
}
// インデックス付きで列挙
for (index, element) in 配列.enumerated() { }
// 2つの配列を対応させる
zip(配列1, 配列2)
メソッド一覧
| メソッド | 概要 |
|---|---|
| 配列.reduce(初期値, 演算) | 初期値から始め、各要素に演算を適用して1つの値に集約します。 |
| 配列.reduce(into: 初期値) { 結果, 要素 in } | inoutで累積値を変更する効率的なreduceです。 |
| 配列.forEach { 要素 in } | 全要素に対してクロージャを実行します。breakが使えません。 |
| 配列.enumerated() | (index, element)のペアのシーケンスを返します。 |
| zip(配列1, 配列2) | 2つのシーケンスを対応させたペアのシーケンスを返します。 |
| zip(配列1, 配列2).map { } | 2つの配列の対応する要素を変換します。 |
サンプルコード
// reduce: 合計を求める
let numbers = [1, 2, 3, 4, 5]
let sum = numbers.reduce(0) { $0 + $1 }
print(sum) // 15
// 演算子で簡潔に
let sumShort = numbers.reduce(0, +)
print(sumShort) // 15
// 最大値を求める
let maxVal = numbers.reduce(Int.min) { max($0, $1) }
print(maxVal) // 5
// reduce(into:): 辞書を構築する例
let words = ["apple", "banana", "apricot", "blueberry", "avocado"]
let grouped = words.reduce(into: [Character: [String]]()) { dict, word in
let key = word.first!
dict[key, default: []].append(word)
}
print(grouped["a"] ?? []) // ["apple", "apricot", "avocado"]
print(grouped["b"] ?? []) // ["banana", "blueberry"]
// forEach: 全要素を処理
["Swift", "Kotlin", "Rust"].forEach { lang in
print("言語: \(lang)")
}
// enumerated: インデックス付きで列挙
let fruits = ["りんご", "みかん", "ぶどう"]
for (i, fruit) in fruits.enumerated() {
print("\(i + 1). \(fruit)")
}
// zip: 2つの配列を対応させる
let names = ["太郎", "花子", "次郎"]
let scores = [85, 92, 78]
for (name, score) in zip(names, scores) {
print("\(name): \(score)点")
}
概要
『forEach』は『for-in』ループと同等ですが、クロージャのためループ内で『break』や『continue』が使えません。途中で処理を止めたい場合は『for-in』ループを使ってください。
『reduce(into:)』は通常の『reduce』よりも辞書や配列を構築する際に効率的です。『zip』は短い方のシーケンスに合わせて切り捨てます。長さが異なる配列を zip するとデータが失われます。
配列の検索については配列.contains() / firstIndex() / lastIndex()を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。