#swift #codable
Вопрос:
Я хотел бы применить available
атрибут с аргументами renamed
и unavailable
к свойству struct
, которое соответствует Codable
, как показано ниже:
struct SampleData: Codable {
@available(*, unavailable, renamed: "newProperty")
let oldProperty: String
let newProperty: String
}
Но когда я попытался создать этот код , я получил ошибку компиляции, подобную этой:
примечание: «oldProperty» явно помечен здесь как недоступный
Если a struct
не соответствует Codable
, это работает хорошо.
Кто-нибудь знает, как решить эту проблему?
И если это невозможно решить, я был бы признателен, если бы вы могли сказать мне, почему.
Заранее спасибо.
Комментарии:
1. можете ли вы также опубликовать приведенный выше код
Ответ №1:
Это связано с тем, что синтезированное 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
}