You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中使用reduce转数组为字典无结果,for循环正常,问题出在哪?

问题原因与解决方案

你的代码问题核心在于值类型的拷贝特性:

Dictionary是Swift中的值类型,当你将self.rates作为reduce(into:)的初始参数传入时,实际上传入的是它的一个副本。闭包内对$0的所有修改都只作用于这个副本,并不会同步到原始的self.rates变量,所以看起来没有任何元素被添加。而for循环是直接操作self.rates本身,因此能正常修改字典内容。

修复方案

方案1:生成新字典后赋值给原变量

直接基于空字典生成新的结果,再替换原变量,这样能触发@Published的更新:

self.rates = res.rates.reduce(into: [String: Double]()) { $0[$1.currencySymbol] = $1.rate }

方案2:基于原字典修改后赋值回去

如果需要保留原字典的内容,仅新增/覆盖新的键值对,可以先拷贝原字典到临时变量,修改后再赋值回去:

var tempRates = self.rates
_ = res.rates.reduce(into: tempRates) { $0[$1.currencySymbol] = $1.rate }
self.rates = tempRates

方案3:使用更适合的merge方法

对于这种“将序列中的键值对合并到现有字典”的场景,Swift字典的merge(_:uniquingKeysWith:)方法更直观高效:

self.rates.merge(res.rates.map { ($0.currencySymbol, $0.rate) }) { _, newValue in newValue }

这里的闭包表示当键重复时,用新值覆盖旧值,和你原for循环的逻辑完全一致。

内容的提问来源于stack exchange,提问作者alphabetF

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 06:40:20