我试图扩展词典但不能用键引用自己。我很困惑为什么会这样。
extension Dictionary {
func foo() {
var result = self["key"]
}
}
我收到此错误: 输入' DictionaryIndex'不符合协议' StringLiteralConvertible'
如果有人有任何见解,我们将不胜感激。
答案 0 :(得分:10)
Dictionary
是Generic
结构。它在Key
和Value
上是通用的。
因此,在您的扩展中,您必须使用Key
作为字典键的类型,并使用Value
作为字典值的类型。
编译器抱怨,因为你使用了错误的字典键扩展名。
以下是一个例子:
extension Dictionary {
func ext(key: Key) {
if let value = self[key] {
// use your value
println("Key is present")
} else {
println("No value for key")
}
}
}
let dic = ["A": 20]
dic.ext("A")
dic.ext("B")
以下是你可以做类似事情的方法......这可能会让你的测试更加清晰:
extension Dictionary {
var foo: String? {
if let key = "key" as? Key {
return self[key] as? String
}
return nil
}
}
let dic1 = ["A": "an A", "key": "the value"]
dic1.foo // "the value" as optional
dic.foo // nil since dic value type is Int
由于Dictionary
是一个通用结构,您可能会重新考虑扩展它,就像它是一个特定的具体类型一样。