Я пытаюсь создать словарь (на самом деле HashSet ) с ключом для настраиваемого протокола в Swift, но он дает мне ошибку в заголовке:
Протокол myProtocol может использоваться только в качестве общего ограничения, поскольку он имеет требования типа Self или связанные с ним.
и я не могу понять это.
protocol Observing: Hashable { }
var observers = HashSet<Observing>()
swift
generics
xcode6
swift-protocols
devios1
источник
источник
Ответы:
Протокол
Observing
наследуется от протоколаHashable
, который, в свою очередь, наследуется от протоколаEquatable
. ПротоколEquatable
имеет следующие требования:И протокол, который находится
Self
где-то внутри, не может использоваться где-либо, кроме как в ограничении типа.Вот похожий вопрос.
источник
Equatable
не обязательно должно подразумевать,Equatable
поскольку это не является строго необходимым для генерации хэш-кода.Dictionary
нужно знать, действительно ли данный объект является правильным ключом, потому что два разных объекта могут генерировать один и тот же хэш-код. Хм, это немного сложно. Так что проблема здесь действительно вEquatable
.Чтобы решить эту проблему, вы можете использовать дженерики. Рассмотрим этот пример:
источник