Що означає "Протокол ... може використовуватися лише як загальне обмеження, оскільки він має власні або асоційовані вимоги до типу"?


123

Я намагаюся створити Словник (власне HashSet ), введений на користувацькому протоколі в Swift, але він дає мені помилку в заголовку:

Протокол 'myProtocol' може використовуватися лише як загальне обмеження, оскільки він має вимоги Self або асоційований тип

і я не можу робити ні голови, ні хвостів.

protocol Observing: Hashable { }

var observers = HashSet<Observing>()


@jtbandes Це не дублікат. Я запитую, що насправді означає повідомлення про помилку. Що таке "власна або асоційована вимога типу"?
devios1

Відповіді:


90

Протокол Observingуспадковується від протоколу Hashable, який у свою чергу успадковує від протоколу Equatable. Протокол Equatableмає таку вимогу:

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

І протокол, який міститься Selfдесь усередині, не може бути використаний ніде, крім обмежень типу.

Ось подібне питання.


7
... тому що компілятор повинен гарантувати, що він є одним і тим же типом з обох сторін, але протокол лише забезпечує його відповідність договору. Я бачу. Тим не менш, здається, що це Equatableне повинно мати на увазі, Equatableоскільки це не обов'язково для створення хеш-коду.
devios1

4
О, не чекайте, що це робить, тому що Dictionaryпотрібно вміти знати, чи справді даний об'єкт є правильним ключем, оскільки два різних об'єкти можуть генерувати один і той же хеш-код. Гм, це трохи хитро. Тож проблема тут справді Equatable.
devios1

4
Подивіться на 0:56 в чудовій презентації Алексіса Галлахера під назвою: Протоколи з асоційованими типами і як вони потрапили таким чином (можливо) youtu.be/XWoNjiSPqI8
finneycanhelp

@finneycanhelp Дякую за це 👍👍. Чудове відео!
devios1

11

Для вирішення цього питання можна використовувати дженерики. Розглянемо цей приклад:

class GenericClass<T: Observing> {
   var observers = HashSet<T>()
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.