在 iOS 和 macOS 之间编码和解码 Int 值

Encoding and Decoding Int Values between iOS and macOS

我正在开发一款应用程序,专门在 iOS 和 macOS 之间跨平台共享数据。我正在使用 NSCoding 将我的模型序列化为一个文件。我的数据模型中的特定 属性 是 Int 类型。下面是在 iOS 和 macOS 上运行的一段代码:

class MyDataModel: NSObject, NSCoding {
   struct Keys {
      static let myNumber = "myNumber"
   } 

   var myNumber: Int = 0

   required init(coder aCoder: NSCoder) {
      super.init()
      myNumber = aDecoder.decodeInteger(PropertyKey.nameKey)
   }

   fun encode(with aCoder: NSCoder) {
      aCoder.encodeInteger(myNumber, forKey: PropertyKey.ratingKey)
   }
}

问题是,如果我将 iOS 上的这个整数保存到 iCloud 上的一个文件中,然后在 macOS 上打开文件并解码,数据会保持不变吗?我听说 Int 在这两个平台上的解释不同。我什至被建议将我的整数存储为字符串,然后将它们转换为整数。有人可以确认这是否属实吗?

我能想到的唯一问题是您可能 运行 遇到 32 位与 64 位环境的问题。 Int 将改变两者之间的最大大小,当它从 64 位变为 32 位时,您可能会得到奇怪的结果。

您可以采取的预防措施是使用特定类型的 Int,例如 Int32Int64。这应该在所有环境中正常工作。然后,您可以在代码中转换为 Int,正确处理任何溢出。

示例:

import Foundation

enum PropertyKey: String {
  case numberKey
}

class MyDataModel: NSObject, NSCoding {
  var myNumber: Int64 = 0 // Explicitly provide integer width

  required convenience init?(coder aCoder: NSCoder) {
    guard let myNumber = aCoder.decodeInt64(forKey: PropertyKey.numberKey.rawValue) as Int64? else {
      return nil
    }
    self.init()
    self.myNumber = myNumber
  }

  func encode(with aCoder: NSCoder) {
    aCoder.encode(myNumber, forKey: PropertyKey.numberKey.rawValue)
  }
}