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つにまとめます。
チャレンジ
簡単2行の入力を読み取ります:
- カンマ区切りの整数のリスト、
nums - カンマ区切りの整数のリスト、
repeats(numsと同じ長さ)
各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 し、"," で結合する
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。