Использование протокола в качестве ограничения типа для самого себя

#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. В дополнение к комментарию Вадиана — Подумайте об этом — Как протокол может быть расшифрован? Какой тип будет создан системой при декодировании? Существует потенциально бесконечное количество конкретных типов, которые могут соответствовать вашему протоколу. Даже если вы просто используете наследование от базового класса, а не от протокола, у вас, вероятно, возникнут проблемы с декодированием, поскольку вам нужно сообщить декодеру, какой конкретный тип подходит для каждого элемента