我需要将 Swift 结构保存到 NSData
。我不符合 NSCoding
,因为它只适用于 NSObject
的子类。
我在 Swift 2.0 中写了一个带有扩展的小协议(protocol)
,它似乎可以在 Playground 中工作。这似乎有点太容易了。
这里有什么我想念的吗?
以下代码可以在 Xcode 7 Beta 5 的 playground 中运行。
//: 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 的序列化解决方案。与其发明自己的协议(protocol),不如看看 RawRepresentable。它比您在这里所做的更通用,因为它不依赖于 NSData。只要您的类型在 RawValue 类型别名中指定,您就可以序列化为任何内容。
关于ios - 在 Swift 中将结构序列化为 NSData,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31881151/