我有一个像这样的枚举结构:
enum MyStruct {
case CanRegister(String, String)
case Register(String, String, String, String, String?)
case Login(String, String)
...
}
是否可以 序列化/编码和解码 这样的结构,以便我可以轻松地将状态保存到NSUserDefaults?
我知道如何序列化自定义结构,甚至是类型的枚举:enum MyStruct:String {},但是我可以用这种结构来完成吗?
由于
答案 0 :(得分:0)
我假设您需要一种通用方法,而不是针对您的特定enum
进行硬编码的方法。我还没有完成任务,但使用Mirror
是你应该开始的地方。将此视为提示而非答案......
(p.s。这是基于this article)的想法
enum MyStruct {
case IntVal(Int)
case CanRegister(String, String)
case Register(String, String, String, String, String?)
case Login(String, String)
// ...
}
func prettyPrint(_ any: Any) -> String {
let m = Mirror(reflecting: any)
var a: String
switch m.displayStyle {
case .some(.tuple):
a = "Tuple"
case .some(.enum):
a = "Enum"
default:
return "\(m.displayStyle)"
}
a += " \(m.subjectType) = ("
for case let (label?, value) in m.children {
a += "\(label), \(value)"
}
return a + ")"
}
let ab = MyStruct.CanRegister("A", "B")
let i = MyStruct.IntVal(7)
prettyPrint(ab) // "Enum MyStruct = (CanRegister, ("A", "B"))"
prettyPrint(i) // "Enum MyStruct = (IntVal, 7)"