Что означает "Протокол... может использоваться только как общее ограничение, потому что он имеет Self или требования к связанному типу"?
Я пытаюсь создать словарь (на самом деле HashSet) с ключом по пользовательскому протоколу в Swift, но он дает мне ошибку в заголовке:
Протокол 'myProtocol' может использоваться только как общее ограничение, потому что он имеет Self или требования к связанному типу.
и я не могу сделать ни головы, ни хвосты этого.
protocol Observing: Hashable { }
var observers = HashSet<Observing>()
Обновить:
Для лучшего объяснения, почему это так, посмотрите это видео.
2 ответа
Решение
Протокол Observing
наследуется от протокола Hashable
который в свою очередь наследует от протокола Equatable
, протокол Equatable
имеет следующее требование:
func ==(lhs: Self, rhs: Self) -> Bool
И протокол, который содержит Self
где-то внутри он не может быть использован нигде, кроме как в ограничении типов.
Вот похожий вопрос.
Для решения этой проблемы вы можете использовать дженерики. Рассмотрим этот пример:
class GenericClass<T: Observing> {
var observers = HashSet<T>()
}