Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- enum UserState {
- case LoggedIn(LoggedInState)
- case LoggedOut(LoggedOutState)
- }
- enum LoggedInState: String {
- case playing
- case paused
- case stopped
- }
- enum LoggedOutState: String {
- case Unregistered
- case Registered
- }
- extension UserState: Codable {
- enum CodingKeys: String, CodingKey {
- case loggedIn
- case loggedOut
- }
- enum CodingError: Error {
- case decoding(String)
- }
- init(from decoder: Decoder) throws {
- let values = try decoder.container(keyedBy: CodingKeys.self)
- if let loggedIn = try? values.decode(String.self, forKey: .loggedIn) {
- self = .LoggedIn(LoggedInState(rawValue: loggedIn)!)
- }
- if let loggedOut = try? values.decode(String.self, forKey: .loggedOut) {
- self = .LoggedOut(LoggedOutState(rawValue: loggedOut)!)
- }
- throw CodingError.decoding("Decoding failed")
- }
- func encode(to encoder: Encoder) throws {
- var container = encoder.container(keyedBy: CodingKeys.self)
- switch self {
- case let .LoggedIn(value):
- try container.encode(value.rawValue, forKey: .loggedIn)
- case let .LoggedOut(value):
- try container.encode(value.rawValue, forKey: .loggedOut)
- }
- }
- }
- class ViewController: UIViewController {
- override func viewDidLoad() {
- super.viewDidLoad()
- let state = UserState.LoggedIn(.playing)
- UserDefaults.standard.set(encoded, forKey: "state")
- }
- }
- [User Defaults] Attempt to set a non-property-list object Codable.UserState.LoggedIn(Codable.LoggedInState.playing) as an NSUserDefaults/CFPreferences value for key state
- 2018-01-20 19:06:26.909349+0200 Codable[6291:789687]
Add Comment
Please, Sign In to add comment