如果我们对符合Codable
的Class对象进行编码,并希望使用具有新属性的新类代码对这些对象进行解码,那么需要哪种代码来使该新属性成为非可选属性,并为其设置默认值?
旧课程:
class Item: Codable {
let id: String
}
新课程:
class Item: Codable {
let id: String
let title: String
}
使用新格式的代码解码以旧格式保存的对象时,将找不到title
属性,并且解码将不起作用。
我们可以通过将title
设置为可选的String?
来解决此问题。
但是如何实现将title
保留为非可选String
,并在解码每个对象时为其提供默认值?
PS:这是完整代码。没有指定编码键,也没有编写来自解码器的自定义初始化。
答案 0 :(得分:3)
您可以实现必需的init并为其提供默认值:
required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
let title = try container.decodeIfPresent(String.self, forKey: .title) ?? "Default title"
self.title = title
let baseDecoder = try container.superDecoder(forKey: .id)
try super.init(from: baseDecoder)
}
答案 1 :(得分:0)
如果由于某种原因不想实现init方法,一种解决方法是将属性设置为可选属性,但将其设置为私有属性,如果可以使用其他名称,则可以使用计算属性代替
class Item: Codable {
let id: String
private let title: String?
var theTitle: String {
return title ?? "Default Title"
}
}