Что означает "Протокол... может использоваться только как общее ограничение, потому что он имеет 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>()
}
Другие вопросы по тегам