Предоставление «резервного протокола соответствия» в Swift - PullRequest
0 голосов
/ 16 февраля 2019

Я пишу код, который имеет дело с произвольными классами, которые соответствуют заданному протоколу, и я хочу сохранить эти классы в 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: предоставление реализации протокола по умолчанию в расширении протокола , но я не думаю, что это примерно одно и то же.

...