假设我在某些JSON中接收数据,然后使用本机工具将其解析为字典。其中一些值是数字,我自然需要解析它们,将它们转换为我在应用程序中需要的内容。
但是从Any
到Float
,Int
,Double
等实际数字的过渡似乎有点混乱。例如,如果我期望一个double,但在某些时候服务器返回一个整数,我的代码将失败使用:
let doubleValue = dictionary["key"] as! Double
因此,当项目为1.3
但1
失败时,这将有效。要使用更具体的示例,我们可以使用以下内容:
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
能够直接投射到Double
或Float
。
所以我的解决方案是使用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
这个看似微不足道的东西?我错过了一些非常明显的东西,对吗?
答案 0 :(得分:1)
试试这样: -
if let data = myDictionary as? [String: AnyObject] {
let myNumber = data["myNumber_int"] as? Int
}