我正在将字典收集到字典中:
\\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'(就地)”?
答案 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}