当你有模型时,如何在 Codable 中使用 init 方法?

How to use init method in codable when you have model inside?

这个代码世界的新手,在此先感谢,

我遇到错误

Cannot assign value of type 'String?' to type 'ModalA.ModalC?'

这是我的模型 class,

struct ModalA: Codable {
    struct ModalB: Codable {
        let value2: String?
        let value3: ModalC?
        private enum CodingKeys: String, CodingKey {
            case value3 = "Any"
            case value2 = "Anything"
        }
        init(from decoder: Decoder) throws {
            let values = try decoder.container(keyedBy: CodingKeys.self)
            value2 = try values.decodeIfPresent(String.self, forKey: .value2)
            value3 = try values.decodeIfPresent(String.self, forKey: .value3) // getting error on this line
        }
    }
    struct ModalC: Codable {
        let value3: String?
    }
    let value1: ModalB?
}

如何解决这个错误?

您的 value3 属性 是 ModalC 类型,但在解码时您试图解析 String 值(当将 String.self 传递给 decodeIfPresent方法)。

decodeIfPresent 方法将可解码值的类型作为第一个参数。在您的情况下 decodeIfPresent 方法 returns String 值,并且您正在尝试将 String 值设置为 ModalC 类型的 属性。

所以要解决这个错误,你应该说你想为键 .value3 获取类型 ModalC 的值。为此,您应该像这样传递 ModalC.self

value3 = try values.decodeIfPresent(ModalC.self, forKey: .value3)

您可以通过

解决这个问题
value3 = try values.decodeIfPresent(ModalC.self, forKey: .value3)

但将 value3 声明为可选

let value3: ModalC?

如果它最初存在于已解析的 json 中,将获取它,所以 ? 就足够了

你应该使用

init(){

}


init(from decoder: Decoder) throws{

}

你可以阅读我的 post here 了解更多信息。