Что означает" протокол ... может использоваться только в качестве общего ограничения, поскольку он имеет собственные или связанные требования к типу"?


Я пытаюсь создать словарь (на самом деле HashSet) набран на пользовательском протоколе в Swift, но это дает мне ошибку в названии:

протокол 'myProtocol' может использоваться только в качестве общего ограничения, поскольку он имеет собственные или связанные требования к типу

и я не могу сделать головы, ни хвоста.

protocol Observing: Hashable { }

var observers = HashSet<Observing>()

обновление:

для лучшего возможного объяснения, почему это так это проверьте это видео.


2 103

2 ответа:

протокол Observing наследует от протокола Hashable, который в свою очередь наследуется из протокола Equatable. Протокол Equatable есть следующее требование:

func ==(lhs: Self, rhs: Self) -> Bool

и протокол, который содержит Self где-то внутри он не может быть использован нигде, кроме как в ограничении типа.

здесь на подобный вопрос.

чтобы решить эту проблему, вы можете использовать дженерики. Рассмотрим следующий пример:

class GenericClass<T: Observing> {
   var observers = HashSet<T>()
}