【问题标题】:Int64 does't work while Int worksInt 工作时 Int64 不起作用
【发布时间】:2016-04-24 07:51:22
【问题描述】:

我收到一个 JSON,我想解析它以获得一个值。我正在这样做

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

如您所见,我正在解析相同的字段。这是我的 JSON

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

打印语句运行良好,但我在oneJson["restaurantId"] as! Int64 上遇到异常

【问题讨论】:

  • 我不知道是什么导致了这个问题(因此评论),但尝试使用(oneJson["restaurantId"] as! NSString).longLongValue,它将给出一个类型为Int64的值

标签: ios json swift


【解决方案1】:

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

请参阅这篇关于 Swift 中不同整数的帖子:https://stackoverflow.com/a/27440158/4687348

【讨论】:

  • 对不起,但这不是答案,我要的是 Int64,我知道为什么我需要 Int64 而不仅仅是 Int。
  • 这可能是个好建议,但实际上并不能解决将值转换为Int64的问题
  • 我觉得最好用String,而不是Int或者Int64,因为javascript对Int64不友好,在js会被截断。跨度>
【解决方案2】:

我喜欢 swift 中的这个怪癖(不)。

这是我所知道的语言中最不直观的陷阱之一。所以事实证明,当你得到一个 AnyObject 类型的 Dictionary 时,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 基类型的事实,事实上,它们仍然只是 NSNumber .

【讨论】:

  • 顺便说一句,您必须相信您的 JSON 库才能知道将其输入正确读取为 int 64,否则您可能会失去精度。我从来没有测试过这个,也没有看到你的实现细节,但它确实值得测试。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-03
    • 1970-01-01
    • 2020-10-05
    • 1970-01-01
    • 1970-01-01
    • 2022-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多