【问题标题】:Cast String to Int64 causes crash on 32bit devices将字符串转换为 Int64 会导致 32 位设备崩溃
【发布时间】:2017-08-07 04:26:05
【问题描述】:

我必须处理一个相当长的 Int,它以字符串的形式出现。打电话 Int64(String) 在 64 位设备上运行良好,但我在 32 位设备上看到崩溃。这是什么原因?

代码如下:

let predicateBarcode = NSPredicate(format: "barcode = %ld", Int64(searchTerm)!)

我无法说出有关搜索词的任何信息,它来自条形码扫描仪并且是 ean-13。我也无法重现崩溃,因为这只会发生在我的客户身上。

【问题讨论】:

  • Int64 表示 32 位和 64 位平台的 64 位有符号整数。所以,通常我们看不到这样的行为。您能否提供更多上下文来重现该问题?
  • 请显示您的代码和崩溃的详细信息。
  • 这真的是您使用的确切代码吗?您的代码无法使用 Xcode 8.3 编译。请不要遗漏任何内容,即使您认为无关紧要。并在崩溃时显示searchTerm 的值。无论如何,即使在 64 位平台上,您的代码也不是有效代码。

标签: ios swift 32-bit int64


【解决方案1】:

不是Int64.init(_:)的问题,而是NSPredicate的格式问题。

长度说明符l表示其参数需要为longunsigned long,相当于Swift中的IntUInt

String Format Specifiers

如果你想使用Int64 值作为格式参数,正确的长度说明符是ll,意思是long long,相当于Swift 中的Int64

let predicateBarcode = NSPredicate(format: "barcode = %lld", Int64(searchTerm)!)

您可能需要修复一些其他部分,但由于您隐藏了其他部分,我看不到。 (就我的测试而言,我无法让我的测试应用程序崩溃。)此外,您是否 100% 确定 Int64(searchTerm)! 不会崩溃?

无论如何,格式字符串至少需要固定。

【讨论】:

  • 谢谢,我会解决这个问题。我还更改了代码以验证 Int64(searchTerm) 不是 nil。
  • 希望您的代码没有其他错误,或者您可以尽快找到它们。祝你好运。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-27
  • 2016-02-08
  • 2015-04-22
  • 1970-01-01
  • 2015-04-17
  • 2015-05-09
  • 1970-01-01
相关资源
最近更新 更多