gpt4 book ai didi

swift - 如何编写一个通用的 Swift 扩展来深度合并两个词典?

转载 作者:搜寻专家 更新时间:2023-11-01 06:32:34 24 4
gpt4 key购买 nike

我正在尝试编写一个函数来深度合并两个词典。我的意思是,当合并两个字典中某个键的值并且这些值都是字典时,它们将被合并,而不是一个被另一个替换。

这是我所拥有的:

extension Dictionary {
public func deepMerged(with other: [Key: Value]) -> [Key: Value] {
var result: [Key: Value] = self
for (key, value) in other {
if let value = value as? [Key: Value], let existing = result[key] as? [Key: Value] {
result[key] = existing.deepMerged(with: value)
} else {
result[key] = value
}
}
return result
}
}

但遗憾的是它无法编译。我得到错误

Cannot convert value of type '[Key : Value]' to expected argument type [_ : _]' on the use of value in the recursive call to `deepMerged(with:).

我可以通过确定扩展的范围来解决这个问题:

extension Dictionary where Key == String, Value == Any {
...
}

此时这适用于我的特定用例,但我不明白为什么更通用的代码不起作用。

最佳答案

请注意,错误是在对 result[key] 的赋值上,而不是在函数调用本身上:

let merged: [Key:Value] = existing.deepMerged(with: value)  //works fine
result[key] = merged //error

编译器知道:

  • result 是一个[Key: Value]
  • other 是一个[Key: Value]
  • key 是一个Key
  • value 是一个Value
  • merged 是一个[Key:Value]
  • result 有一个 subscript(key: Key) -> Value? { get set }(即 Value? 类型的可写下标,它接受 Key)

但它知道 [Key:Value] 是一个 Value,所以它不知道 merged可以传给result的下标。由于 value 是一个 Valuevalue 也是 [Key: Value],我们知道 [ Key: Value] 必须是 Value,但编译器不知道。

一个解决方案是将 merged 转换为 Value:

extension Dictionary {
public func deepMerged(with other: [Key: Value]) -> [Key: Value]
{
var result: [Key: Value] = self
for (key, value) in other {
if let value = value as? [Key: Value],
let existing = result[key] as? [Key: Value],
let merged = existing.deepMerged(with: value) as? Value
{
result[key] = merged
} else {
result[key] = value
}
}
return result
}
}

关于swift - 如何编写一个通用的 Swift 扩展来深度合并两个词典?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45220441/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com