extension Dictionary where Key: ExpressibleByStringLiteral, Value: Any {
func date(forKey key: String) -> Date? {
return self[key] as? Date
}
}
let dictionary: [String : Any] = ["mydate" : Date(), "otherkey" : "Rofl"]
dictionary.date(forKey:"mydate") // should return a Date? object
//我得到了对成员'下标'
的错误模糊引用如何让我的扩展程序允许我提供一个键并使用下标而不是文字,而是一个"动态"字符串形式的键?
答案 0 :(得分:4)
删除不需要的约束,并在您认为合适的地方直接使用Key
或Value
类型。
extension Dictionary {
func date(forKey key: Key) -> Date? {
return self[key] as? Date
}
}
答案 1 :(得分:2)
只需将key: String
替换为key: Key
:
extension Dictionary where Key: ExpressibleByStringLiteral, Value: Any {
func date(forKey key: Key) -> Date? {
return self[key] as? Date
}
}
答案 2 :(得分:1)
您可以通过"代理"获得一点糖语法。日期查询到这样的事情:
struct DictionaryValueProxy<DictKey: Hashable, DictValue, Value> {
private let dictionary: [DictKey:DictValue]
init(_ dictionary: [DictKey:DictValue]) {
self.dictionary = dictionary
}
subscript(key: DictKey) -> Value? {
return dictionary[key] as? Value
}
}
extension Dictionary {
var dates: DictionaryValueProxy<Key, Value, Date> { return DictionaryValueProxy(self) }
}
然后,您可以无缝地向字典询问日期:
let dict: [Int:Any] = [1: 2, 3: Date()]
dict.dates[1] // nil
dict.dates[3] // "Dec 7, 2016, 5:23 PM"