Ios 在Swift中将结构序列化为NSData
我需要将Swift结构保存到Ios 在Swift中将结构序列化为NSData,ios,swift,swift2,Ios,Swift,Swift2,我需要将Swift结构保存到NSData。我无法遵守NSCoding,因为它只适用于NSObject的子类 我在Swift 2.0中编写了一个带有扩展的小协议,它似乎在操场上工作。这似乎有点太容易了 这里有什么我遗漏的吗 以下代码可以在Xcode 7 Beta 5中的操场上运行 //: Playground - noun: a place where people can play import UIKit protocol Serializable { init?(encode
NSData
。我无法遵守NSCoding
,因为它只适用于NSObject
的子类
我在Swift 2.0中编写了一个带有扩展的小协议
,它似乎在操场上工作。这似乎有点太容易了
这里有什么我遗漏的吗
以下代码可以在Xcode 7 Beta 5中的操场上运行
//: Playground - noun: a place where people can play
import UIKit
protocol Serializable {
init?(encodedData: NSData)
var encodedData: NSData { get }
}
extension Serializable {
var encodedData: NSData {
var pointer = self
return NSData(bytes: &pointer, length: sizeof(Self.self))
}
init?(encodedData data: NSData) {
guard
data.length == sizeof(Self.self)
else { return nil }
self = UnsafePointer(data.bytes).memory
}
}
struct Test: CustomStringConvertible, Serializable {
let message: String
let people: [String]
let color: UIColor
var description: String {
return "\(message) + \(people) + \(color)"
}
}
let structToEncode = Test(message: "Hi!", people: ["me", "someone else"], color: UIColor(red: 0.5, green: 0.2, blue: 0.1, alpha: 0.4))
let encodedData = structToEncode.encodedData
let decodedStruct = Test(encodedData: encodedData)
我也一直在寻找Swift的序列化解决方案。与其发明自己的协议,不如看看RawRepresentable。它比您在这里所做的更通用,因为它与NSData无关。只要您的类型在RawValue类型别名中指定,就可以序列化为任何内容。另一种解决方案是将数据序列化为JSON。我刚刚创建了一个使这更简单的方法,它应该适用于结构、枚举和类。要使用它,您需要实现
ToJSON
和FromJSON
协议。然后,要序列化和反序列化数据,可以使用Aeson.encode
和Aeson.decode
功能 我编写了一个框架,用Swift序列化结构、类和枚举,尽管它序列化为plist文件(仅为方便起见,可以是任何格式)
高级别说明:
- 序列化到中间字符串:通过协议扩展提供
方法来表示任何对象。你不需要做任何事情来支持这方面的事情toDictionary()
- 通过泛型反序列化,每个类型都应该有一个init(本质上)提供有关其属性的类型信息
这里有一个,还有一个。我感觉这样做行不通,如果您将数据写入文件,请重新启动应用程序并尝试读取文件,因为我认为您只是在存储对内存的引用,而不是内存本身。我目前正在寻找一个解决方案。这可能在理论上回答了这个问题,但最好在这里为将来的用户提供答案的基本部分,并提供链接供参考。可以通过以下方式变得无效。