2016-07-22 80 views
1

我有一個枚舉結構類似:有帶參數的情況下,序列化枚舉結構

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

是否有可能序列化/編碼和解碼結構一樣,所以我可以很容易地狀態保存到NSUserDefaults的?

我知道如何序列化自定義結構,甚至是類型爲枚舉的枚舉:enum MyStruct:String {},但是我可以用那種結構來做到這一點嗎?

感謝

回答

0

我假設你想在這裏的一般方法,而不是一個硬編碼爲特定enum。我一直沒有完成,但使用Mirror是你應該開始的地方。認爲這是一個提示,而不是一個答案......

(附註:這是基於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)"