Я пишу код, который имеет дело с произвольными классами, которые соответствуют заданному протоколу, и я хочу сохранить эти классы в Set
.Для этого они должны соответствовать Hashable
.
Очевидно, что произвольный класс может или не может уже соответствовать Hashable
;и если он уже не соответствует, я хотел бы добавить соответствие по умолчанию (что я знаю, как сделать, например, используя ObjectIdentifier
или аналогичный).
Для иллюстрации: предположим, я пишупротокол для прослушивателя событий и класса, который его использует.Вот мой нерабочий код:
protocol Listener: class {
somethingHappened()
}
class ThingThatHasListeners {
var listeners = Set<Hashable>()
func addListener(listener: AnyObject) {
if let listener = listener as? Hashable {
// already conforms to Hashable, great!
listeners.insert(listener)
}
else {
hashableListener = someMagicThatAppliesDefaultHashable(listener)
listeners.insert(hashableListener)
}
}
}
Есть несколько вещей, которые не верны в этом коде;и someMagicThatAppliesDefaultHashable
это бит, где я не уверен, что делать.
Для этой части я подумал о наличии прокси-класса, который обернет реальный объект, который обеспечит Hashable
, но я считаю, что способности Swift для проксирования ограничены.
Я имеювидел вопрос и ответы на Swift: предоставление реализации протокола по умолчанию в расширении протокола , но я не думаю, что это примерно одно и то же.