【问题标题】:Storing Int64 in UserDefaults在 UserDefaults 中存储 Int64
【发布时间】:2015-03-26 11:28:46
【问题描述】:

我这样定义我的字典:

var teamsData = Dictionary<String,Dictionary<String,Int64>>()

然后,我尝试将其存储在 userdefaults 中:

NSUserDefaults.standardUserDefaults().setObject(teamsData, forKey: "teamsData")

但它会抛出错误:

Type Dictionary<String,Dictionary<String,Int64>> does not conform to protocol 'Any Object'

【问题讨论】:

    标签: xcode swift dictionary nsuserdefaults


    【解决方案1】:

    用户默认对象只能是一个实例(或 实例)的 NSDataNSStringNSNumberNSDateNSArrayNSDictionary

    一些 Swift 类型会自动桥接到 Foundation 类型, 例如IntUIntFloatDoubleBool 被桥接 到NSNumber。所以这可以保存在用户默认值中:

    var teamsData = Dictionary<String,Dictionary<String,Int>>()
    

    在 64 位架构上,Int 一个 64 位整数,但在 32 位架构,Int 是一个 32 位整数。

    Int64 等固定大小的整数类型不是 自动桥接到NSNumber。这也被观察到 在Swift - Cast Int64 to AnyObject for NSMutableArray。 因此,要在用户默认值中存储 64 位整数,您有 明确使用NSNumber

    var teamsData = Dictionary<String,Dictionary<String,NSNumber>>()
    
    // Example how to add a 64-bit value:
    let value : UInt64 = 123
    teamsData["foo"] = ["bar" : NSNumber(unsignedLongLong: value)]
    

    【讨论】:

      【解决方案2】:

      Martin 的回答对于 Swift 3 不再正确,因为 set 函数现在类型为 Any? 而不是 AnyObject?

      您可以像这样在 UserDefaults 中存储 Int64:

      import Foundation
      let value: Int64 = 1000000000000000
      UserDefaults.standard.set(value, forKey: "key")
      if let value2 = UserDefaults.standard.object(forKey: "key") as? Int64 {
          // value2 is an Int64 with a value of 1000000000000000
          print(value2)
      }
      

      您可以将上述代码粘贴到 Swift Playground 中并自己尝试。

      【讨论】:

      • 你有没有因为使用这个而得到一个 SIGABRT 错误?
      • 我没有。你用的是什么版本的 Swift?
      • 3.0,我相信。我现在正在使用 Int,希望在我用完 32 位整数之前它可以工作......
      • 奇怪,我绝对没有看到崩溃。另一种选择是将其存储为字符串,然后在执行用户默认写入/读取时仅转换为整数/从整数转换。不理想,但如果它让你崩溃,这是一个适用于任何长度整数的选项。
      【解决方案3】:

      斯威夫特 4:

      您可以在 UserDefaults 中将 int64 保存为字符串

      let value: Int64 = 1000000000000000
      let stringValue = String(value)
      UserDefaults.standard.set(stringValue, forKey: "int64String")
      

      就像你避免 Int 截断一样。

      然后你就可以恢复原来的值了:

      let int64String = UserDefaults.standard.string(forKey: "int64String")
      let originalValue = Int64(int64String!)
      

      这允许您将其与其他 int64 值进行比较

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多