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 反馈 — 无需本地设置。
此课程中的所有课时
- map 与 compactMap
- filter 与谓词
- reduce 与 reduce(into:)
- flatMap 与链式操作