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