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

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


Я пытаюсь создать словарь (на самом деле HashSet), введенный на основе пользовательского протокола в Swift, но он дает мне ошибку в название, и я не могу делать из него ни головы, ни хвосты.

protocol Observing: Hashable {
}

...

var observers = HashSet<Observing>()

Ответ 1

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

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

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

Здесь - аналогичный вопрос.

Ответ 2

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

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