不能将 @available 与 Codable 一起使用
Can't use @available unavailable with Codable
我想将带有 renamed
和 unavailable
参数的 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
}
我想将带有 renamed
和 unavailable
参数的 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
}