首页 > 解决方案 > 不能将 @available 与 Codable 一起使用

问题描述

我想将available带有renamedunavailable参数的属性应用于struct符合的属性Codable,如下所示:

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

但是,当我尝试构建此代码时,出现如下编译错误:

注意:“oldProperty”已在此处明确标记为不可用

在此处输入图像描述

如果 astruct不符合Codable,它工作得很好。

在此处输入图像描述

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

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

提前致谢。

标签: swiftcodable

解决方案


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

如果您初始化oldProperty为某个值,它会起作用,并添加一个CodingKey枚举来告诉自动合成的一致性仅编码/解码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
}

推荐阅读