#ios #swift #protocols
Вопрос:
Я использую протокол для определения основного набора общих свойств, которые будут использоваться всеми Items
.
protocol AnyItemable {
...
var parentId: String? { get set }
var parent: AnyItemable?
..
}
У меня также есть тип, который я могу использовать в качестве универсального, где он должен быть идентифицируемым и кодируемым:
typealias Itemable = AnyItemable amp; Identifiable amp; Codable
Теперь, когда я создаю какой-либо тип элемента, он реализует детализируемый протокол:
struct PhotoItem: Itemable {
// Protocol fields
...
var parentId: String?
var parent: AnyItemable?
...
// Fields specific to this struct
var photoUrl: String?
}
Это приводит к следующей ошибке:
Type 'PhotoItem' does not conform to protocol 'Decodable'
Я полагаю, это потому, что протоколы по своей сути не поддаются декодированию? Как мы могли бы решить эту проблему? Наша цель состоит в том, чтобы любая Itemable
структура могла также иметь родителя, который может иметь N типов, соответствующих Itemable
Комментарии:
1. Для чего нужен код
AudioItem
?2. Извините, я имел в виду, что это должно быть фото, обновлено
3. Это может быть опечатка, но структура также не соответствует ни одному из возможных вариантов. Протокол использует
String
значение дляparentID
, в то время как реализация используетString?
, т. е. необязательную строку.4. В
Codable
контексте любой тип должен соответствовать конкретному типуCodable
. Это не может быть протоколом.5. В дополнение к комментарию Вадиана — Подумайте об этом — Как протокол может быть расшифрован? Какой тип будет создан системой при декодировании? Существует потенциально бесконечное количество конкретных типов, которые могут соответствовать вашему протоколу. Даже если вы просто используете наследование от базового класса, а не от протокола, у вас, вероятно, возникнут проблемы с декодированием, поскольку вам нужно сообщить декодеру, какой конкретный тип подходит для каждого элемента