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になります。

自分で試してみよう

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腕試し

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

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