Menu
Coddy logo textTech

flatMap

CoddyのSwiftジャーニー「ロジックとフロー」セクションの一部 — レッスン 29/56。

flatMapは、各要素が複数の結果を生成する場合に使用します。クロージャは配列を返し、flatMapはそれらすべてを1つのフラットな配列に連結します。

let groups = [[1, 2, 3], [4, 5], [6]]
let all = groups.flatMap { $0 }
print(all)                       // [1, 2, 3, 4, 5, 6]

クロージャの中で実際の処理を行うこともできます。各値を小さな配列にマッピングし、その結果を一段階でフラット化するのが一般的なユースケースです:

let nums = [1, 2, 3]
let pairs = nums.flatMap { [$0, $0 * $0] }
print(pairs)                     // [1, 1, 2, 4, 3, 9]

mapと比較してみてください。mapでは、小さな配列の配列である[[Int]]が生成され、それを平坦化するためにもう一つのステップが必要になります。flatMapは、これら2つのステップを1つにまとめます。

challenge icon

チャレンジ

簡単

2行の入力を読み取ります:

  1. カンマ区切りの整数のリスト、nums
  2. カンマ区切りの整数のリスト、repeatsnumsと同じ長さ)

iについて、nums[i]を正確にrepeats[i]回繰り返します。結果のフラットな配列を,で連結して出力します。flatMapを使用してください。

1行目の入力が5,7,2で、2行目の入力が3,1,2の場合、出力は5,5,5,7,2,2になります。

チートシート

flatMapは各要素を配列にマッピングし、すべての結果を単一のフラットな配列に連結します:

let nums = [1, 2, 3]
let pairs = nums.flatMap { [$0, $0 * $0] }
print(pairs) // [1, 1, 2, 4, 3, 9]

map[[Int]]を生成します)とは異なり、flatMapは1つのステップでフラット化を行います。また、入れ子になった配列を直接フラット化することもできます:

let groups = [[1, 2, 3], [4, 5], [6]]
let all = groups.flatMap { $0 }
print(all) // [1, 2, 3, 4, 5, 6]

自分で試してみよう

let nums = readLine()!.components(separatedBy: ",").map { Int($0)! }
let repeats = readLine()!.components(separatedBy: ",").map { Int($0)! }

// TODO: 各 (num, repeat) を Array(repeating:count:) に flatMap し、"," で結合する
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

ロジックとフローのすべてのレッスン