Dictionary
Generic
struct. Он является общим для его 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
является generic struct, вы можете пересмотреть его, как если бы это конкретный тип бетон.
Это не скомпилируется, потому что ключ словаря является общим типом и не обязательно должен содержать строку. И вы (в настоящее время) не можете определить метод расширения, который ограничен определенными значениями типового заполнителя, сравните http://stackoverflow.com/questions/24938948/array-extension-to-remove-object-by-value для соответствующего проблема для массива. –