我试图合并两个Dictionary
个对象。当他们都有value
key
时,我希望第二个Dictionay
的值覆盖第一个,但有几个例外:
Dictionary
个对象时,我希望合并它们,并使用相同的方法递归。Array
个对象时,我希望它们连接在一起。我的代码如下:
extension Dictionary where Key:Hashable, Value:AnyObject {
func merge(with second: [Key : Value]) -> [Key : Value] {
var resultDictionary = self
for (key, value) in second {
switch value {
case let newDict as [Key : Value]:
if let oldDict = resultDictionary[key] as? [Key : Value] {
resultDictionary[key] = oldDict.merge(with: newDict) // 1
} else {
resultDictionary[key] = newDict // 2
}
case let newArray as [Value]:
if let oldArray = resultDictionary[key] as? [Value] {
resultDictionary[key] = oldArray + newArray // 3
} else {
resultDictionary[key] = newArray // 4
}
default:
resultDictionary[key] = value
}
}
return resultDictionary
}
}
我进入评论栏:
我认为所有这些错误都是相同的,如果不是非常密切相关的话。似乎下划线在这里被用作一种类型,但我并不是在这种情况下的含义。我认为下划线仅用于表示未使用的变量。
答案 0 :(得分:2)
您可以通过将表达式拆分为两个来实现错误:
let newValue: [Key: Value] = oldDict.merge(with: newDict)
resultDictionary[key] = newValue // 1
请注意,现在您要将[Key: Value]
字典分配给需要类型Value
的字词。
你需要一个演员
resultDictionary[key] = newValue as? Value // 1
从类型的角度来看,这一切都很奇怪。您不应该尝试将字典转换为某些提供的类型。
为什么不将此功能仅添加到AnyObject
作为值的词典中?
extension Dictionary where Key:Hashable, Value == AnyObject
然后
resultDictionary[key] = newValue as AnyObject
演员现在是一个编译时演员,很好而且安全。