如何为允许使用带有动态密钥的下标的字典进行扩展?

时间:2016-12-07 13:07:49

标签: swift swift-extensions

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

//我得到了对成员'下标'

的错误模糊引用

如何让我的扩展程序允许我提供一个键并使用下标而不是文字,而是一个"动态"字符串形式的键?

3 个答案:

答案 0 :(得分:4)

删除不需要的约束,并在您认为合适的地方直接使用KeyValue类型。

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"