Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
配列.map() / compactMap() / flatMap()
配列の各要素を変換・加工する高階関数です。通常の変換、オプショナルの除去、ネスト配列の平坦化をそれぞれ担当します。
構文
// 各要素を変換して新しい配列を返します。
配列.map { 変換処理 }
// 変換結果がnilの要素を除外した配列を返します。
配列.compactMap { 変換処理 }
// 変換結果の配列を1次元に平坦化した配列を返します。
配列.flatMap { 変換処理 }
メソッド一覧
| メソッド | 概要 |
|---|---|
| map(_:) | 各要素にクロージャを適用して変換した新しい配列を返します。元の配列の要素数と同じ数の要素が返ります。 |
| compactMap(_:) | 各要素を変換し、結果が『nil』だった要素を除外した配列を返します。オプショナルの変換に最適です。 |
| flatMap(_:) | 各要素をシーケンスに変換し、結果を1次元に平坦化した配列を返します。 |
サンプルコード
// map: 各要素を変換します。
let numbers = [1, 2, 3, 4, 5]
let doubled = numbers.map { $0 * 2 }
print(doubled) // [2, 4, 6, 8, 10]
let names = ["alice", "bob", "charlie"]
let upper = names.map { $0.uppercased() }
print(upper) // ["ALICE", "BOB", "CHARLIE"]
// compactMap: 変換失敗(nil)を除外します。
let strings = ["1", "two", "3", "four", "5"]
let ints = strings.compactMap { Int($0) }
print(ints) // [1, 3, 5](変換できない文字列は除外されます)
// オプショナルの配列からnilを除外します。
let optionals: [String?] = ["りんご", nil, "みかん", nil, "ぶどう"]
let fruits = optionals.compactMap { $0 }
print(fruits) // ["りんご", "みかん", "ぶどう"]
// flatMap: ネスト配列を平坦化します。
let nested = [[1, 2, 3], [4, 5], [6, 7, 8]]
let flat = nested.flatMap { $0 }
print(flat) // [1, 2, 3, 4, 5, 6, 7, 8]
// 文字列を文字の配列に変換してまとめます。
let words = ["swift", "code"]
let chars = words.flatMap { $0 }
print(chars) // ["s", "w", "i", "f", "t", "c", "o", "d", "e"]
概要
『map()』は配列の全要素を変換する最も基本的な高階関数です。クロージャの引数『$0』が各要素を表し、変換後の値を返すと新しい配列が作られます。元の配列は変更されず、常に同じ要素数の配列が返ります。
『compactMap()』は型変換(例:文字列→整数)や、オプショナルを返す処理と組み合わせると便利です。『map()』の後で『filter { $0 != nil }』と『map { $0! }』を組み合わせるよりも、『compactMap()』1つで書く方が安全で簡潔です。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。