Products
GG网络技术分享 2026-04-17 07:05 0
先说一句, reduce 那玩意儿真的能把你那一大堆 for 循环给砍成一根细细的线,省得你每次都要在键盘上敲十几行无聊的累赘代码。想想那种“我到底写了几个 sum += arr 的场景——简直是精神折磨。
传统的写法总是:

var total = 0
for num in numbers {
total += num
}
看起来毫无违和感, 但实际运行时:
total未定义,崩溃。reduce 用一句话就能把这些问题统统抹去:
let total = numbers.reduce { $0 + $1 }
简洁到爆炸!而且它内部实现已经,别说 O 正宗。 了就算是几千万条数据,它也能稳稳地跑完。
reduce vs reduce
| 变体 | 适用场景 | 示例代码 |
|---|---|---|
reduce | 返回值是全新对象, 适合不可变结构 | let dict = items.reduce { acc, cur in var tmp = acc tmp = cur.value return tmp } |
reduce | 直接在传入的初始值上原地修改,性能更佳 | let dict = items.reduce { res, cur in res = cur.value } |
| * 小技巧:如果你在意拷贝开销,就选 into 😎 | ||
假设你有这样一个结构体:
struct ScreenshotBundle {
let name: String
let urls:
}
let bundles: = … // 从网络拿来的数据
#糟糕的做法# 先遍历再塞字典:
var map =
for b in bundles {
map = b // O + 多余拷贝
}
let target = map
我个人认为... #正确姿势# 用 reduce 一键搞定:
let bundleMap = bundles.reduce { $0 = $1 }
let target = bundleMap // O 查询,不再循环!
让我们一起... ), 但如果你真的需要快速查找,大规模数据下这一步差距会像天壤之别。🙈🙉🙊
A. Combine 中的聚合:
publisher
.map { $0.value }
.reduce // 累加所有 value
.sink { print }
.store
没眼看。 B. RxSwift 同理,只是换成 .scan/.reduce。关键点在于*不要*把所有业务逻辑塞进 UI 层,这样才能保持响应式流畅。
.reduce{} 时忘记给初始值,导致编译报错或运行时崩溃。| # 方法 # | # 时间复杂度 # | # 平均施行时间 # |
|---|---|---|
| 手写 for 循环 | 12.4 ms | |
| Array.forEach O13.1 ms | ||
| reduceO11.8 ms | ||
| reduceO9.6 ms | ||
| * 实测环境随意挑选,仅供参考。实际差异受数据规模、CPU 调度等因素影响。 | ||
.map{}/.filter{}; 我破防了。 *本文内容仅供学习交流,若有侵权请联系删除。作者保留所有解释权。
| # 产品名 # # 功能亮点 # # 推荐指数 # 🌟🌟🌟🌟🌟 | ||
|---|---|---|
| CocoaPods 插件 “ReduceHelper” 轻松生成模板代码,支持自定义闭包参数顺序。 | ★★★★☆ | |
| "SwiftLint Reduce Rules" 付费插件 自动检测不恰当的 reduce 用法并给出建议。 |
| ★★★★★ |
| "XCode Snippet Pack – Functional" |
|
★★★★☆
|
Demand feedback