首页 > 解决方案 > 内部有模型时如何在可编码中使用init方法?

问题描述

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

我收到错误

无法分配“字符串”类型的值?键入“ModalA.ModalC?”

这是我的模型课,

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?
}

如何解决这个错误?

标签: iosswift4codabledecodableswift4.1

解决方案


您的value3属性是 type ModalC,但是在解码时您试图解析String值(传递String.selfdecodeIfPresent方法时)。

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

因此,要解决该错误,您应该说您想要获取ModalCkey的类型值.value3。为此,您应该ModalC.self像这样通过:

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

推荐阅读