可选键的默认枚举值

时间:2019-06-18 20:43:28

标签: swift codable

我有一个始终具有 array([0.2 , 0.1 , 0.22, 0.15, 0.3 ]) 的JSON对象,有时有一个text密钥,当没有时,我想为我的{{1 }}枚举。

我知道我需要覆盖format中的.regular,但是我该如何做才能检测格式键(如果为空),请使用SubStep.Format,然后解码始终存在的init键?

谢谢

SubStep

2 个答案:

答案 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
    }
}