Menu
CoddyTech

flatMap

本课属于 Coddy Swift 学习旅程的“逻辑与流程”单元。第 29 课,共 56 课。

flatMap 适用于每个元素会生成多个结果的情况。闭包会返回一个数组;flatMap 会将它们全部连接成一个扁平数组。

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 比较:它会生成一个 [[Int]],也就是由小数组组成的数组,你还需要再执行一步将其展平。flatMap 将这两个步骤合并为一步。

challenge icon

挑战

简单

读取两行输入:

  1. 一组以逗号分隔的整数,即 nums
  2. 一组以逗号分隔的整数,即 repeats(长度与 nums 相同)

对于每个 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) 使用 flatMap,将其转换为 Array(repeating:count:);再用 "," 连接。
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

逻辑与流程中的所有课

自己练习: Swift 在线编辑器