我需要将一个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)