扩展词典与Swift

时间:2015-11-04 11:58:10

标签: swift

extension Dictionary{
    var postDic:String{
        let date = NSDate.init(timeIntervalSinceNow: 0)
        let timestamps = date.timeIntervalSince1970
        let v = String(timestamps)
        var tempDic = self
        tempDic["v"] = v
        return "123"
    }
}

出现错误

enter image description here

为什么?

3 个答案:

答案 0 :(得分:1)

您需要将对象转换为键值。您将需要进行变异方法而不是只读计算属性。您需要将键约束为StringLiteralConvertible类型,尝试这样的事情:

extension Dictionary where Key: StringLiteralConvertible {
    mutating func postDic(value: Value) {
        guard
            let timeKey = NSDate().timeIntervalSince1970.description as? Key

        else {return}
        self[timeKey] = value
    }
}


var dic:[String:AnyObject] = [:]


dic.postDic("Test")

print(dic)  // "["1446650572.81642": Test]\n"

答案 1 :(得分:0)

您不能对所有类型的索引使用“字符串”。 你应该知道Key可以是Int,String或者你想要的任何东西。 请勿在您的扩展程序中提供类型。

答案 2 :(得分:0)

Dictionary是一种通用类型。实际上它是Dictionary<Key: Hashable, Value>,其中Key可以是采用Hashable协议的任何类型。

下面:

tempDic["v"] = v

...您尝试将v值分配给关键"v",就像您知道KeyValue始终都是String一样事实并非如此。这就是错误的原因。

为了解决这个问题,您应该使计算属性postDic能够处理各种键和值,或者将扩展名限制为特定类型的Key和{{ 1}}使用Value子句。

选择哪个选项取决于您想要达到的目标。