序列化具有参数

时间:2016-07-22 10:18:32

标签: ios serialization enums swift2 deserialization

我有一个像这样的枚举结构:

enum MyStruct {
    case CanRegister(String, String)
    case Register(String, String, String, String, String?)
    case Login(String, String)
    ...
}

是否可以 序列化/编码和解码 这样的结构,以便我可以轻松地将状态保存到NSUserDefaults?

我知道如何序列化自定义结构,甚至是类型的枚举:enum MyStruct:String {},但是我可以用这种结构来完成吗?

由于

1 个答案:

答案 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)"