当你有模型时,如何在 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 了解更多信息。
这个代码世界的新手,在此先感谢,
我遇到错误
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 了解更多信息。