Swift 如何修改';任何';变量是否首先检查其类型?

Swift 如何修改';任何';变量是否首先检查其类型?,swift,Swift,我正在将统计数据收集到字典中: var metrics = [String:Any] 这些指标可以是整数、双精度、字符串,所以我尝试使用任何一种 我初始化一个度量,如下所示: metrics["sentBeacons"] = UInt(0) 但是现在如果我试图修改它,编译器会抛出一个错误: metrics["sentBeacons"]! += 1 // Error: can't apply Int to Any? 我知道,它不可能知道那个键有Int 我试过: if metrics["sen

我正在将统计数据收集到字典中:

var metrics = [String:Any]
这些指标可以是整数、双精度、字符串,所以我尝试使用任何一种

我初始化一个度量,如下所示:

metrics["sentBeacons"] = UInt(0)
但是现在如果我试图修改它,编译器会抛出一个错误:

metrics["sentBeacons"]! += 1 // Error: can't apply Int to Any?
我知道,它不可能知道那个键有Int

我试过:

if metrics["sentBeacons"] is UInt {
    metrics["sentBeacons"]! += 1
}
但是没有骰子。我也试过打字:

if var sentBeacons = metrics["sentBeacons"] as? UInt {
    sentBeacons += 1
}
但这也不行,因为(我认为)字典是一种值类型,我只访问变量的一个副本


我如何询问编译器:“如果这个‘Any’现在是Int,那么将‘1’添加到它(原地)”

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

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

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

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}

该死,你比我快了30秒!我在这两方面都做过。:)回想起来,这是显而易见的。非常感谢。