将 String 转换为 Int64 导致 32 位设备崩溃
Cast String to Int64 causes crash on 32bit devices
我必须处理一个很长的 Int,它以字符串的形式出现。呼唤
Int64(String)
在 64 位设备上工作正常,但我看到在 32 位设备上崩溃。这是什么原因?
代码如下:
let predicateBarcode = NSPredicate(format: "barcode = %ld", Int64(searchTerm)!)
关于 searchterm,我无法透露任何信息,它来自条形码扫描仪,是一个 ean-13。我也无法重现崩溃,因为这只发生在我的客户身上。
不是Int64.init(_:)
的问题,而是给NSPredicate
的格式问题。
长度说明符l
表示它的参数需要是long
或unsigned long
,相当于[=36=中的Int
或UInt
].
如果要使用 Int64
值作为格式参数,正确的长度说明符是 ll
,意思是 long long
相当于 Int64
in Swift.
let predicateBarcode = NSPredicate(format: "barcode = %lld", Int64(searchTerm)!)
您可能需要修复其他部分,但我看不到,因为您隐藏了其他部分。 (据我测试,我无法让我的测试应用程序崩溃。)此外,您是否 100% 确定 Int64(searchTerm)!
不会崩溃?
无论如何,格式字符串至少需要固定。
我必须处理一个很长的 Int,它以字符串的形式出现。呼唤
Int64(String)
在 64 位设备上工作正常,但我看到在 32 位设备上崩溃。这是什么原因?
代码如下:
let predicateBarcode = NSPredicate(format: "barcode = %ld", Int64(searchTerm)!)
关于 searchterm,我无法透露任何信息,它来自条形码扫描仪,是一个 ean-13。我也无法重现崩溃,因为这只发生在我的客户身上。
不是Int64.init(_:)
的问题,而是给NSPredicate
的格式问题。
长度说明符l
表示它的参数需要是long
或unsigned long
,相当于[=36=中的Int
或UInt
].
如果要使用 Int64
值作为格式参数,正确的长度说明符是 ll
,意思是 long long
相当于 Int64
in Swift.
let predicateBarcode = NSPredicate(format: "barcode = %lld", Int64(searchTerm)!)
您可能需要修复其他部分,但我看不到,因为您隐藏了其他部分。 (据我测试,我无法让我的测试应用程序崩溃。)此外,您是否 100% 确定 Int64(searchTerm)!
不会崩溃?
无论如何,格式字符串至少需要固定。