Int工作时Int64不起作用

时间:2016-01-19 00:37:12

标签: ios json swift

我收到了JSON,我想解析它以获取值。我这样做

let ddd = oneJson["restaurantId"] as! Int
print("ddd = \(ddd)")
let restaurantId = oneJson["restaurantId"] as! Int64

如你所见,我正在解析同一个字段。这是我的JSON

"location":"location here location","restaurantId":0

print语句工作得很好,但我在oneJson["restaurantId"] as! Int64

上得到了一个例外

enter image description here

3 个答案:

答案 0 :(得分:8)

我很喜欢这个怪癖(不是)。

这是我所知道的语言中最不直观的问题之一。所以事实证明,当你得到一个AnyObject类型的字典时,Ints,Doubles,Floats,不会存储为Swift本机类型。他们被存储为......惊喜!的NSNumber。

这会导致一系列不直观的行为,例如类型检查AnyObjects以查看您是否有Double或Int(无法完成)。

出于同样的原因,您的代码失败了。将其更改为:

let ddd = oneJson["restaurantId"] as! Int
print("ddd = \(ddd)")
let restaurantId = (oneJson["restaurantId"] as? NSNumber)?.longLongValue

并且一次又一次地提醒自己,当它是你正在施放的AnyObject时,Swift正在向你隐瞒它从NSNumber转换为Swift基类型的事实,事实上,它们仍然只是NSNumbers

答案 1 :(得分:0)

我建议不要使用Int64(或Int32)。 Int在大多数情况下都会有效。

请参阅这篇文章,了解Swift中的不同整数:https://stackoverflow.com/a/27440158/4687348

答案 2 :(得分:0)

是的,它是Swift 3中的已知错误,已在Swift 4中解决。
现在,你就是这样写的,

let n = NSNumber.init(value: 9223372036854775807) // 2^63 - 1
print(n, n as! Int64) // will print the right answer.