我有一个始终具有 array([0.2 , 0.1 , 0.22, 0.15, 0.3 ])
的JSON对象,有时有一个text
密钥,当没有时,我想为我的{{1 }}枚举。
我知道我需要覆盖format
中的.regular
,但是我该如何做才能检测格式键(如果为空),请使用SubStep.Format
,然后解码始终存在的init
键?
谢谢
SubStep
答案 0 :(得分:2)
您无需为init(from:)
创建自定义Format
方法,只需为SubStep
创建一个方法。您需要使用container.decodeIfPresent(_:forKey:)
来解码JSON中可能不存在的密钥,在这种情况下,它将返回nil
。
struct SubStep: Decodable {
enum Format: String, Decodable {
case bold
case regular
}
let format: SubStep.Format
let text: String
private enum CodingKeys: String, CodingKey {
case text, format
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
self.text = try container.decode(String.self, forKey: .text)
self.format = try container.decodeIfPresent(Format.self, forKey: .format) ?? .regular
}
}
与您的问题无关,但是如果您的String
案例的rawValue与案例名称完全匹配,则无需提供rawValue
enum
自动为您合成这些。
答案 1 :(得分:1)
作为一种替代解决方案,您不必在解析过程中插入默认值,而可以使用计算属性。
struct SubStep: Decodable {
enum Format: String, Decodable {
case bold
case regular
}
private let formatOptional: Format?
let text: String
private enum CodingKeys: String, CodingKey {
case formatOptional = "format"
case text
}
var format: Format {
return formatOptional ?? .regular
}
}