如果标题丢失,我希望初始化返回nil。
?
添加到init
会产生以下错误:失败的初始化器('init?')无法满足初始化失败器的初始要求'init(from :)'
if title == nil { return nil}
会产生以下错误:只有失败的初始化程序才能返回“ nil”
class ClassA: Decodable {
let title: String
let subtitle: String?
private enum CodingKeys: String, CodingKey {
case title
case subtitle
}
required init(from decoder: Decoder) throws {
// changing the signature to:
// required init?(from decoder: Decoder) throws
// produced:
// Non-failable initializer requirement 'init(from:)' cannot be satisfied by a failable initializer ('init?')
let container = try decoder.container(keyedBy: CodingKeys.self)
guard let theTitle = try container.decode(String.self, forKey: .title) else {
return nil // Only a failable initializer can return 'nil'
}
title = theTitle
subtitle = try? container.decode(String.self, forKey: .subtitle)
}
}
答案 0 :(得分:0)
Failable initializer
暂时不适用于Codable
类型。
此外,我认为这种情况甚至不需要failable initializer
。如果 JSON 中没有nil
,因为它不是title
,则将自动获得对象的optional
。
而且,enum CodingKeys
并没有要求,因为根据您的代码,属性名称与 JSON密钥相匹配。
都不需要实施init(from:)
,因为您在这里没有进行任何特定的解析。
保持模型尽可能干净,
class ClassA: Decodable {
let title: String
let subtitle: String?
}
您可以使用
来解析 JSON响应let classA = try? JSONDecoder().decode(ClassA.self, from: data)