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
相关产品推荐
相关产品推荐

