从String转换大型Int

时间:2016-08-10 07:23:52

标签: swift string int 32bit-64bit

似乎应该是相当微不足道的事情已经引起了我很多问题。我试图从String转换一个大整数到Int类型。基本上我有一个64位散列,在某一点上作为String传递,我需要将它转换回Int。

根据我能找到的所有文档,在Swift中,Int类型是64位。调用,Int(str)应该处理64位转换就好了。但似乎它试图将其转换为32位整数,因此我收到一个零值。由于各种原因,我无法使用Int64()(简而言之,我的哈希表中的键必须是Int而不是Int64类型)。

代码如下所示:

在课程开始时宣布:

res/values-large-mdpi/dimens.xml (600x1024)
res/values-sw600dp/dimens.xml  (600x1024)
res/values-sw720dp/dimens.xml  (800x1280)
res/values-xlarge-xhdpi/dimens.xml (2560x1600 - Nexus 10")
res/values-large-xhdpi/dimens.xml  (1200x1920 - Nexus 7"(latest))

稍后在某个函数中声明:

var nameTable: Dictionary<Int, String> = [:]

let kv = data[i].componentsSeparatedByString(":") self.nameTable[Int(kv[0])!] = kv[1] kv[0]="3928953869951869841" kv[1]="a"在哪里失败,因为在意外时返回了nil值。

Int(kv([0])!返回值2147483647,32位max int,考虑到所有docs将int作为64位值,这对我来说很奇怪。代码已经在iPhone 5 - 6上运行,所有结果都相同。

非常感谢任何帮助。谢谢!

2 个答案:

答案 0 :(得分:0)

Int(“string”) - 是可选类型 如果要排除nil异常,请尝试以下代码:

    let stingNumber = "3928953869951869841"
    if let index = Int64("\(stingNumber)") {
        self.nameTable[index] = "a"
        NSLog("\(self.nameTable)")
        NSLog("\(Int64.max)")
    }

我在iPhone 4s上模拟了这个,我有日志:

2016-08-10 15:22:24.199 stackoverlow-38866748[52907:1401199] [3928953869951869841: "a"] 
2016-08-10 15:22:24.202 stackoverlow-38866748[52907:1401199] 9223372036854775807

答案 1 :(得分:0)

请参阅中的Int Apple开发者文档:

  

在32位平台上,IntInt32的大小相同,在64位平台上,Int的大小与Int64相同。

3928953869951869841超出了32位整数的范围。 因此,为了将该值存储为整数,您具有 使用Int64(或UInt64),无法绕过它(除非应用仅限于64位设备)。

另请注意hashValue()州的文档:

  

在程序的不同执行中,不保证哈希值相等。不要保存在将来执行期间使用的哈希值。