错误引用类型" _":"无法分配类型' [值]'的值输入' _?'"

时间:2017-05-23 16:12:17

标签: swift dictionary

我试图合并两个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
    }
}

我进入评论栏:

  1. 无法转换类型的值' [Key:Value]'预期参数类型' [_:_]'
  2. 无法指定类型的值' [Key:Value]'输入' _?'
  3. 无法指定类型的值' [值]'输入' _?'
  4. 无法指定类型的值' [值]'输入' _?'
  5. 我认为所有这些错误都是相同的,如果不是非常密切相关的话。似乎下划线在这里被用作一种类型,但我并不是在这种情况下的含义。我认为下划线仅用于表示未使用的变量。

1 个答案:

答案 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

演员现在是一个编译时演员,很好而且安全。