在Swift中提供“后备协议一致性”

时间:2019-02-16 18:21:15

标签: swift swift-protocols

我正在编写一个处理符合给定协议的任意类的代码,我想将这些类存储在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: Providing a default protocol implementation in a protocol extension看到了问题和答案,但我认为这几乎是一回事。

0 个答案:

没有答案