在 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
,例如 Int32
或 Int64
。这应该在所有环境中正常工作。然后,您可以在代码中转换为 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)
}
}
我正在开发一款应用程序,专门在 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
,例如 Int32
或 Int64
。这应该在所有环境中正常工作。然后,您可以在代码中转换为 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)
}
}