Вам не нужно создавать пользовательский метод 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
для ваших enum
кейсов, если их rawValue будет точно соответствовать названию кейса, компилятор автоматически создаст их для вас.