如何通过首先检查“Any”变量的类型来修改它?

时间:2016-08-10 19:28:17

标签: swift

我正在将字典收集到字典中:

\\x00

这些指标可以是Ints,Doubles,Strings,所以我试图使用Any。

我初始化这样的指标:

var metrics = [String:Any]

但是现在如果我尝试修改它,编译器会抛出一个错误:

metrics["sentBeacons"] = UInt(0)

据我所知,它无法知道该密钥有一个Int。

我试过了:

metrics["sentBeacons"]! += 1 // Error: can't apply Int to Any?

但没有骰子。我也试过类型转换:

if metrics["sentBeacons"] is UInt {
    metrics["sentBeacons"]! += 1
}

但这也不起作用,因为(我认为)Dictionary是一种值类型,我只访问变量的副本。

我怎么能问编译器:“如果这个'Any'现在是一个Int,那么就加'1'(就地)”?

2 个答案:

答案 0 :(得分:4)

您可以使用新的计算值更新词典:

if var sentBeacons = metrics["sentBeacons"] as? UInt {
    sentBeacons += 1
    metrics["sentBeacons"] = sentBeacons
}

答案 1 :(得分:1)

我自己做了一个扩展,在处理字典时封装了读/修改/写入步骤:

extension Dictionary {
    func transformValue(forKey key: Key, valueTransformer: (oldValue: Value?) -> Value) -> Dictionary {
        var copy = self
        copy[key] = valueTransformer(oldValue: self[key])
        return copy
    }
}

metricts.transformValue(forKey: "sentBeacons"){UInt($0!) + 1}