【问题标题】:How to save an array of Int64 variables using NSCoding in Swift如何在 Swift 中使用 NSCoding 保存 Int64 变量数组
【发布时间】:2017-01-11 12:40:46
【问题描述】:

我目前正在使用 NSCoding 来保存 Int 变量数组,如下所示:

var myArray = [Int]()

myArray = aDecoder.decodeObjectForKey("MyArray") as! [(Int)]

aCoder.encodeObject(myArray, forKey: "MyArray")

我现在需要保存一个 Int64 变量数组。我认为这很简单,所以我这样做了:

var myNewArray = [Int64]()

myNewArray = aDecoder.decodeObjectForKey("MyNewArray") as! [(Int64)]

aCoder.encodeObject(myNewArray, forKey: "MyNewArray")

但是我在最后一行得到一个错误: 无法将类型“[Int64]”的值转换为预期的参数类型“AnyObject?”

我很困惑为什么它适用于 Int 而不是 Int64。我怎样才能做到这一点?

【问题讨论】:

标签: ios arrays swift


【解决方案1】:

我很困惑为什么它适用于 Int 而不是 Int64。我怎样才能做到这一点?

它实际上也不适用于 Int。你必须有一个Objective-C 对象的数组,而数字在Objective-C中不是一个对象。

然而,Swift 桥接 Int 到 NSNumber 自动,所以它看起来 像它工作。

它不适用于 Int64。您必须自己创建 NSNumber 对象。

【讨论】:

    【解决方案2】:

    在当前版本的 Swift 中,当您将 [Int] 转换为 AnyObject(或 AnyObject?)时,Swift 会生成包含 NSNumbers 的 NSArray。虽然NSNumber 可以包含Int64(C/Objective-C 中的long long int),但Swift 不会自动将Int64 转换为NSNumber,因此[Int64] 无法自动转换为AnyObject

    您可以显式生成包含NSNumberNSArray

    let myI64Array = aDecoder.decodeObjectForKey("MyNewArray") as! [NSNumber]
    myNewArray = myI64Array.map{$0.longLongValue}
    

    或者:

    let myI64Array = myNewArray.map{NSNumber(longLong: $0)}
    aCoder.encodeObject(myI64Array, forKey: "MyNewArray")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-15
      • 1970-01-01
      • 2017-05-22
      • 1970-01-01
      相关资源
      最近更新 更多