整数文字 '115000159351' 在存储到 'Int' 时溢出,但在一个项目中工作正常,但在另一个项目中工作正常 - Swift
Posted
技术标签:
【中文标题】整数文字 \'115000159351\' 在存储到 \'Int\' 时溢出,但在一个项目中工作正常,但在另一个项目中工作正常 - Swift【英文标题】:Integer literal '115000159351' overflows when stored into 'Int' but works fine in one project but not another - Swift整数文字 '115000159351' 在存储到 'Int' 时溢出,但在一个项目中工作正常,但在另一个项目中工作正常 - Swift 【发布时间】:2018-08-12 06:24:43 【问题描述】:我有一个来自 zendesk 的 ios 库,我使用他们给我的编号按类别对帮助台项目进行排序。这就是我告诉它我想要什么类别的方式:
hcConfig.groupIds = [115000159351]
但是,XCODE 正在抛出
的错误Integer literal '115000159351' overflows when stored into 'Int'
好的,我明白了。可能是因为数字超过 32 位。但是我有另一个我制作的应用程序,我有一个同样长的号码,而且这个应用程序构建得很好,没有错误。完全相同的代码,只是数字略有不同。
hcConfig.groupIds = [115000158052]
为什么一个项目会构建,而另一个不会?
参考这里是他们的说明: https://developer.zendesk.com/embeddables/docs/ios_support_sdk/help_center#filter-articles-by-category
【问题讨论】:
可能一个编译为 32 位应用,另一个编译为 64 位应用。 我检查了两个应用程序在构建设置中都是 arm64 :( 其实我发现了这个问题。我只是在模拟器上作为调试运行的一个没有错误的应用程序,所以它只构建 64 位版本。无法运行的应用程序我正在构建发布(存档)版本,因此它试图构建 64 位和 32 位。我需要同时支持 64 位和 32 位设备。那么如何在上面的 NSnumber 中使用数字 115000159351 并且仍然成功构建 32 位和 64 位?hcConfig.groupIds = [115000159351 as Int64]
呢?
无法将类型“[Int64]”的值分配给类型“[NSNumber]”
【参考方案1】:
Swift Int
是 32 位或 64 位整数,具体取决于平台。
要在所有平台上从 64 位文字创建 NSNumber
(数组),请使用
let groupIds = [NSNumber(value: 115000159351 as Int64)]
或
let groupIds = [115000159351 as Int64 as NSNumber]
【讨论】:
这似乎应该可以工作,但我得到 Cannot assign value of type '[[NSNumber]]' to type '[NSNumber]' @JohnRogersColumbiaEDU:您是否将groupdIds
包装到另一个数组中?我希望 hcConfig.groupIds = groupIds
或 hcConfig.groupIds = [115000159351 as Int64 as NSNumber]
编译。【参考方案2】:
当两个整数都转换为二进制时,它们需要大约 37 左右的相等位
1101011000110100010110010110001110111 = 115000159351
1101011000110100010110010011101100100 = 115000158052
因此,似乎正在运行的应用程序被编译为 64 位应用程序,而失败的应用程序被编译为 32 位应用程序。 请验证一次。
请参考How to convert xcode 32 bit app into 64 bit xcode app 将您的应用从 32 位转换为 64 位
要在 NSNumber 中使用大数,请使用以下方法:
NSNumber *value = [NSNumber numberWithLongLong:115000159351];
此外,以下代码在 32 位上也适用于我:
var groupIds = [NSNumber]();
groupIds = [115000158052, 115000158053, 115000158054]
groupIds = [115000158052 as NSNumber, 115000158053 as NSNumber, 115000158054 as NSNumber]
groupIds = [115000158052 as Int64 as NSNumber, 115000158053 as Int64 as NSNumber, 115000158054 as Int64 as NSNumber]
我认为 groupIds 不是 NSNumber 而是 Int。
【讨论】:
我检查了两个应用程序在构建设置中都是 arm64 :( 其实我发现了这个问题。一个没有错误的应用程序我只是在模拟器上作为调试运行,所以它只构建 64 位版本。无法运行的应用程序我正在构建发布(存档)版本,因此它试图构建 64 位和 32 位。我需要同时支持 64 位和 32 位设备。那么如何在上面的 NSnumber 中使用数字 115000159351 并且仍然成功构建 32 位和 64 位? 你可以使用 [NSNumber numberWithLongLong:115000159351];,更新了答案。请以这种方式检查一次。以上是关于整数文字 '115000159351' 在存储到 'Int' 时溢出,但在一个项目中工作正常,但在另一个项目中工作正常 - Swift的主要内容,如果未能解决你的问题,请参考以下文章