我定义了这样一个枚举:
enum ClubLevel: Int, Codable {
case golden = 1, silver, bronze
}
在我的结构中,我有一个类型为 ClubLevel
的可选属性,当我在 init(from decoder: Decoder)
中解码此属性时:
self.clubLevel = try container.decode(ClubLevel?.self, forKey: .clubLevel)
我遇到这个错误:
调试描述:“无法从无效的 Int 值 0 初始化 ClubLevel”,underlyingError:nil“
我想知道即使这个属性是可选的,解码器也不会继续
有什么想法吗?
最佳答案
线
self.clubLevel = try container.decode(ClubLevel?.self, forKey: .clubLevel)
不尝试解码 ClubLevel
,如果不成功则分配 nil
。它的作用是:
- 尝试为
clubLevel
key 解码nil
(在 JSON 中表示为null
)。如果不成功, - 尝试为
clubLevel
key 解码ClubLevel
。如果不成功, - 抛出错误
因此,如果 clubLevel
键的值既不是 nil
也不是有效的 ClubLevel
表示,您将抛出错误。您会注意到,这也意味着如果 clubLevel
键完全缺失(而不是以 nil
的值出现),您将得到一个错误抛出。
忽略丢失的键是用decodeIfPresent
完成的:
self.clubLevel = try container.decodeIfPresent(ClubLevel.self, forKey: .clubLevel)
现在将:
- 如果容器中缺少
clubLevel
key ,则返回nil
。如果他们的 key 存在, - 尝试为
clubLevel
key 解码nil
(在 JSON 中表示为null
)。如果不成功, - 尝试为
clubLevel
key 解码ClubLevel
。如果不成功, - 抛出错误
这是在编译器生成的 init(from:)
实现中解码可选值的默认行为。它仍然会在您的情况下引发错误,因为 clubLevel
键的值不是有效的 ClubLevel
。
如果你只想尝试解码一个ClubLevel
,在由于任何原因( key 丢失,无效值)解码失败时分配nil
, 等), 那么你想使用 try?
:
self.clubLevel = try? container.decode(ClubLevel.self, forKey: .clubLevel)
关于swift - 可解码,不解码具有无效值的可选枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47906137/