不能将 @available 与 Codable 一起使用

Can't use @available unavailable with Codable

我想将带有 renamedunavailable 参数的 available 属性应用于符合 [=15] 的 struct 的 属性 =],如下图:

struct SampleData: Codable {
    @available(*, unavailable, renamed: "newProperty")
    let oldProperty: String
    let newProperty: String
}

但是当我尝试构建这段代码时,出现了这样的编译错误:

note: 'oldProperty' has been explicitly marked unavailable here

如果一个struct不符合Codable,它工作正常。

有谁知道如何解决这个问题?

如果无法解决这个问题,请告诉我原因,我将不胜感激。

提前致谢。

这是因为合成的 Codable 一致性也在尝试 decode/encode oldProperty。它不能 not 这样做,因为所有存储的属性都必须初始化,即使它们不可用。

如果您将 oldProperty 初始化为某个值,并添加一个 CodingKey 枚举以告诉自动合成的一致性仅 encode/decode newProperty,它将起作用:

struct SampleData: Codable {
    @available(*, unavailable, renamed: "newProperty")
    let oldProperty: String = ""
    let newProperty: String
    
    enum CodingKeys: CodingKey {
        case newProperty
    }
}

实际上,根据情况,您可以将 oldProperty 转换为计算的 属性,在这种情况下您不需要编码密钥。

struct SampleData: Codable {
    @available(*, unavailable, renamed: "newProperty")
    var oldProperty: String { "" }
    let newProperty: String
}