有没有更好的方法从字典中获取数字(JSON数据)?

时间:2018-05-15 10:29:25

标签: swift dictionary casting

假设我在某些JSON中接收数据,然后使用本机工具将其解析为字典。其中一些值是数字,我自然需要解析它们,将它们转换为我在应用程序中需要的内容。

但是从AnyFloatIntDouble等实际数字的过渡似乎有点混乱。例如,如果我期望一个double,但在某些时候服务器返回一个整数,我的代码将失败使用:

let doubleValue = dictionary["key"] as! Double

因此,当项目为1.31失败时,这将有效。要使用更具体的示例,我们可以使用以下内容:

let myDictionary: [String: Any] = [
    "myNumber_int" : 1,
    "myNumber_float" : Float(1),
    "myNumber_cgFloat" : CGFloat(1),
    "myNumber_double" : 1.0
]

let numberInt1 = myDictionary["myNumber_int"] as? Int // 1
let numberInt2 = myDictionary["myNumber_int"] as? Float // nil
let numberInt3 = myDictionary["myNumber_int"] as? CGFloat // nil
let numberInt4 = myDictionary["myNumber_int"] as? Double // nil

let numberFloat1 = myDictionary["myNumber_float"] as? Int // nil
let numberFloat2 = myDictionary["myNumber_float"] as? Float // 1
let numberFloat3 = myDictionary["myNumber_float"] as? CGFloat // nil
let numberFloat4 = myDictionary["myNumber_float"] as? Double // nil

let numberCGFloat1 = myDictionary["myNumber_cgFloat"] as? Int // nil
let numberCGFloat2 = myDictionary["myNumber_cgFloat"] as? Float // nil
let numberCGFloat3 = myDictionary["myNumber_cgFloat"] as? CGFloat // 1
let numberCGFloat4 = myDictionary["myNumber_cgFloat"] as? Double // nil

let numberDouble1 = myDictionary["myNumber_double"] as? Int // nil
let numberDouble2 = myDictionary["myNumber_double"] as? Float // nil
let numberDouble3 = myDictionary["myNumber_double"] as? CGFloat // nil
let numberDouble4 = myDictionary["myNumber_double"] as? Double // 1

因此,对于每种类型,只有1个演员实际上可以工作......好吧我至少期望CGFloat能够直接投射到DoubleFloat

所以我的解决方案是使用NSNumber

let myNumbers: [CGFloat] = [
    CGFloat((myDictionary["myNumber_int"] as? NSNumber)?.floatValue ?? 0.0),
    CGFloat((myDictionary["myNumber_float"] as? NSNumber)?.floatValue ?? 0.0),
    CGFloat((myDictionary["myNumber_cgFloat"] as? NSNumber)?.floatValue ?? 0.0),
    CGFloat((myDictionary["myNumber_double"] as? NSNumber)?.floatValue ?? 0.0),
] // [1,1,1,1]

这自然有效,但代码对于像这样简单的事情来说非常难看。但是把代码"丑陋"在旁边;如果不使用Next Step,我们可以不做类似的事吗?我的意思是NSNumber这个看似微不足道的东西?我错过了一些非常明显的东西,对吗?

1 个答案:

答案 0 :(得分:1)

试试这样: -

if let data = myDictionary as? [String: AnyObject] {
    let myNumber = data["myNumber_int"] as? Int
}