整数文字 '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 = groupIdshcConfig.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的主要内容,如果未能解决你的问题,请参考以下文章

为什么在将大于i32的数字存储到变量中时,我没有得到文字超出范围错误?

如何将整数“范围”放入 OWL 文字值中?

JS文本框只能输入整数

为啥 C 字符文字是整数而不是字符?

mpandroidchart Y轴怎么显示整数

整数到二进制存储在数组中