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

Swift中如何为不可变字典添加新条目生成新字典?

在Swift中为不可变字典添加条目生成新字典的简洁方法

嘿,我完全懂你习惯Kotlin里用+直接合并不可变字典的便捷性,在Swift里默认确实没有这个操作,但有几个简洁的方案能满足你的需求,不用写繁琐的自定义扩展:

1. 重载+操作符(最贴近Kotlin的写法)

如果你想完全复刻Kotlin里+的使用体验,可以给Dictionary重载+操作符,这样就能像你最初想的那样直接相加:

extension Dictionary {
    static func + (lhs: Self, rhs: Self) -> Self {
        lhs.merging(rhs) { _, new in new }
    }
}

// 使用示例
let a: [String: Any] = ["Test": 1, "good": false]
let b = a + ["hello": "there"]
print(b) // 输出: ["Test": 1, "good": false, "hello": "there"]

这个重载逻辑会让右边字典的键值对覆盖左边的(如果有重复键),和你之前自定义的merge方法逻辑一致。

2. 使用Swift 5.0+自带的merging方法(无需自定义扩展)

从Swift 5.0开始,系统给Dictionary提供了merging实例方法,专门用来基于当前不可变字典生成一个合并了新条目的新字典:

let a: [String: Any] = ["Test": 1, "good": false]
// 闭包参数用来处理键冲突,这里我们选择用新值覆盖旧值
let b = a.merging(["hello": "there"]) { _, newValue in newValue }
print(b) // 输出: ["Test": 1, "good": false, "hello": "there"]

这个方法是系统原生的,不用自己写扩展代码,非常省心。

为什么你之前的尝试会报错?

  • 关于+操作符:Swift默认没有给字典实现+的重载,所以直接用会提示操作符不适用。
  • 关于updateValue:这个方法是可变方法(mutating),只能被var声明的可变字典调用,而你用的是let声明的不可变字典,所以无法调用。另外它的返回值是被替换的旧值(如果存在),不是合并后的新字典,用法本身也不符合你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 18:07:40