【问题标题】:Serialize enum struct that have cases with arguments序列化具有带参数案例的枚举结构
【发布时间】:2016-07-22 10:18:32
【问题描述】:

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

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

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

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

谢谢

【问题讨论】:

    标签: ios serialization enums swift2 deserialization


    【解决方案1】:

    我假设您在这里需要一种通用方法,而不是为您的特定 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)"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-12
      • 1970-01-01
      • 1970-01-01
      • 2015-02-01
      • 1970-01-01
      • 2017-12-09
      相关资源
      最近更新 更多