0Pricing
Swift Academy · 课时

reduce 与 reduce(into:)

将集合聚合为单个值。

reduce 与 reduce(into:) 是 CoddyKit 上的免费 Swift Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Swift Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Swift Academy 课程共包含 4 节课。

什么是归约

reduce 会通过反复将累加器与每个元素组合,把整个序列归并为一个值。

  • 您需要提供一个初始值
  • 以及一个闭包 (accumulator, element) -> accumulator

使用归约求和

经典示例 — 将所有值相加:

let nums = [1, 2, 3, 4]
let total = nums.reduce(0) { acc, x in acc + x }
print(total)  // 10

运算符简写

当闭包只是一个运算符时,您可以直接传入该运算符函数:

let nums = [1, 2, 3, 4]
print(nums.reduce(0, +))   // 10
print(nums.reduce(1, *))   // 24

归约为不同类型

结果类型可以不同于元素类型:

let words = ["a", "b", "c"]
let joined = words.reduce("") { $0 + $1.uppercased() }
print(joined)  // "ABC"

使用归约查找最大值

除了求和,您还可以计算其他聚合结果:

let nums = [3, 9, 2, 7]
let maxVal = nums.reduce(Int.min) { max($0, $1) }
print(maxVal)  // 9

归约的代价

普通的 reduce 会在每一步创建一个全新的累加器。对于 String 或 Array 这样的值类型,这意味着每处理一个元素就要复制整个累加器 — 对大型输入而言,工作量为 O(n²)。

使用 reduce(into:)

reduce(into:) 会将累加器作为 inout 参数传入,因此您可以原地修改它,而不必复制:

let nums = [1, 2, 2, 3, 3, 3]
let counts = nums.reduce(into: [Int: Int]()) { dict, n in
    dict[n, default: 0] += 1
}
print(counts)  // [1: 1, 2: 2, 3: 3]

高效构建数组

在累加到集合时,reduce(into:) 尤其有用:

let nums = [1, 2, 3, 4, 5]
let evensSquared = nums.reduce(into: [Int]()) { result, n in
    if n % 2 == 0 { result.append(n * n) }
}
print(evensSquared)  // [4, 16]

reduce 与 reduce(into:) 对比

结果相同,但性能特征不同:

let parts = ["a", "b", "c"]
let a = parts.reduce("") { $0 + $1 }            // copies each step
let b = parts.reduce(into: "") { $0 += $1 }    // mutates in place
print(a, b)  // abc abc

使用 reduce(into:) 分组

一种常见模式:根据键将项目分桶:

let names = ["Ann", "Al", "Bo", "Cy"]
let byInitial = names.reduce(into: [Character: [String]]()) { dict, name in
    dict[name.first!, default: []].append(name)
}
print(byInitial[Character("A")]!)  // ["Ann", "Al"]

如何选择

对于廉价的标量累加器(整数、双精度浮点数),请使用 reduce。当累加器是集合或其他大型值类型时,请使用 reduce(into:),以避免复制。

let nums = [1, 2, 3]
print(nums.reduce(0, +))                          // scalar: plain reduce
print(nums.reduce(into: Set<Int>()) { $0.insert($1) }) // collection: into

快速检查

构建字典或数组时,为什么更适合使用 reduce(into:)?

回顾

您已经学习了归约:

  • reduce(initial) { acc, x in ... } 会将序列归并为一个值
  • 运算符简写:reduce(0, +)
  • reduce(into:) 会修改 inout 累加器 — 应将它用于集合
  • 非常适合计数、分组和拼接

接下来:扁平映射与串联。

常见问题解答

「reduce 与 reduce(into:)」课时是免费的吗?

是的 — 「reduce 与 reduce(into:)」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Swift Academy 课程的其余内容,请升级到 CoddyKit PRO。 Swift Academy 课程共包含 4 节课。

「reduce 与 reduce(into:)」这节课中我会学到什么?

将集合聚合为单个值。 你通过在浏览器中直接运行的动手代码来练习 Swift Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Swift Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Swift Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「reduce 与 reduce(into:)」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Swift Academy 课中编写并运行代码吗?

能。每节 Swift Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. map 与 compactMap
  2. filter 与谓词
  3. reduce 与 reduce(into:)
  4. flatMap 与链式操作
← 返回 Swift Academy