gpt4 book ai didi

swift - 如何将 Codable 协议(protocol)用于具有其他枚举作为关联值的枚举(嵌套枚举)

转载 作者:行者123 更新时间:2023-11-28 15:06:39 25 4
gpt4 key购买 nike

我问了一个question昨天关于如何在 UserDefaults 中保存嵌套枚举。
我正在尝试为此使用 Codable 协议(protocol),但不确定我是否正确执行。

这又是我要存储的枚举 -> UserState:

enum UserState {
case LoggedIn(LoggedInState)
case LoggedOut(LoggedOutState)
}

enum LoggedInState: String {
case playing
case paused
case stopped
}

enum LoggedOutState: String {
case Unregistered
case Registered
}

以下是我到目前为止执行的步骤:

遵循 Codable 协议(protocol)并指定我们使用哪些 key 进行编码/解码:

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, forKey: .loggedIn) // --> Ambiguous reference to member 'encode(_:forKey:)'
case let .LoggedOut(value):
try container.encode(value, forKey: .loggedOut) // --> Ambiguous reference to member 'encode(_:forKey:)'
}
}

encode 方法给我上面的两个错误。现在不确定我做错了什么,或者我是否走在正确的轨道上。

知道我做错了什么以及导致这两个模棱两可的错误的原因吗?

最佳答案

关联的 valueLoggedInStateLoggedOutState 但您必须对其 rawValue (字符串)进行编码:

    case let .LoggedIn(value):
try container.encode(value.rawValue, forKey: .loggedIn)
case let .LoggedOut(value):
try container.encode(value.rawValue, forKey: .loggedOut)
}

根据您从 rawValue 创建枚举案例的 decode 方法。

关于swift - 如何将 Codable 协议(protocol)用于具有其他枚举作为关联值的枚举(嵌套枚举),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48358141/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com