可编码:为新的非可选属性提供默认值

时间:2019-09-02 17:33:01

标签: swift

如果我们对符合Codable的Class对象进行编码,并希望使用具有新属性的新类代码对这些对象进行解码,那么需要哪种代码来使该新属性成为非可选属性,并为其设置默认值?

旧课程:

class Item: Codable {
    let id: String
}

新课程:

class Item: Codable {
    let id: String
    let title: String
}

使用新格式的代码解码以旧格式保存的对象时,将找不到title属性,并且解码将不起作用。

我们可以通过将title设置为可选的String?来解决此问题。

但是如何实现将title保留为非可选String,并在解码每个对象时为其提供默认值?

PS:这是完整代码。没有指定编码键,也没有编写来自解码器的自定义初始化。

2 个答案:

答案 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"
    }
}