【问题标题】:Converting large Int from String从 String 转换大 Int
【发布时间】:2016-12-16 10:40:23
【问题描述】:

看似微不足道的事情却给我带来了很多问题。我正在尝试将大整数从字符串转换为 Int 类型。基本上我有一个 64 位散列,它在某一时刻作为字符串传递,我需要将它转换回 Int。

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

代码如下:

在课程开始时声明:

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

稍后在某些函数中声明:

let kv = data[i].componentsSeparatedByString(":")
self.nameTable[Int(kv[0])!] = kv[1]

其中kv[0]="3928953869951869841"kv[1]="a" 部分Int(kv([0])! 失败,因为意外返回了nil 值。

Int.max 返回一个 2147483647 的值,即 32 位最大 int,考虑到所有文档将 int 声明为 64 位值,这让我觉得很奇怪。代码已在 iPhone 5 - 6s 上运行,结果相同。

任何帮助将不胜感激。谢谢!

【问题讨论】:

  • 这不是转换问题,可能您的kv[0] 值为零
  • 我希望是这样,但是打印出 kv[0] 给了我我放在那里的值
  • Int 在所有 32 位设备(例如 iPhone 4、5)上为 32 位,在 64 位设备(例如 iPhone 5S、6)上为 64 位。所以你的代码应该在 64 位设备上运行,但在 32 位设备上会失败。
  • @MartinR 所以为了支持 iPhone 5,我必须使用 Int64?
  • hashValue() 返回 Int,因此是 32 位或 64 位。请注意,传递散列值是没有意义的,它在不同的调用之间不稳定(特别是依赖于平台)。

标签: swift string int 32bit-64bit


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    Int in Apple 开发者文档:

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

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

    另请注意,hashValue() 的文档指出:

    不保证哈希值在程序的不同执行中是相等的。不要保存哈希值以供将来执行时使用。

    【讨论】:

      猜你喜欢
      • 2015-05-11
      • 2020-04-05
      • 2011-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-05
      • 2013-06-07
      • 1970-01-01
      相关资源
      最近更新 更多