【发布时间】:2018-01-20 17:08:59
【问题描述】:
跟进我之前的question:
我设法使我的枚举符合 Codable 协议,实现了 init() 和 encode() 并且它似乎工作。
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)!)
}
else if let loggedOut = try? values.decode(String.self, forKey: .loggedOut) {
self = .LoggedOut(LoggedOutState(rawValue: loggedOut)!)
}
else {
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(state, forKey: "state")
}
}
我的问题是我不知道如何将它保存到 UserDefaults。如果我像现在一样保存它,我会在运行应用程序时收到以下错误:
[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]
【问题讨论】:
-
上面例子中的
encoded是什么? -
对不起,它应该在那里。类型问题。
-
@Kobe:请注意我在您的问题中所做的代码更改。无论如何,解码器都会抛出错误。
-
请注意,当使用 Decodable 协议解析 JSON 时,您可以抛出 DecodingError 而不是创建自己的错误类型。 stackoverflow.com/a/46458771/2303865
标签: swift nsuserdefaults codable