Нельзя использовать @доступно недоступно с кодируемым

#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
}