Swift 提供';回退协议一致性';迅速地

Swift 提供';回退协议一致性';迅速地,swift,swift-protocols,Swift,Swift Protocols,我正在编写一个代码,它处理符合给定协议的任意类,我想将这些类存储在集中。要做到这一点,它们需要符合Hashable 显然,任意类可能符合也可能不符合Hashable;如果它还不符合,我想添加一个默认的符合性(我知道如何做,例如通过使用ObjectIdentifier或类似方法) 举例说明:假设我正在为事件侦听器和使用它的类编写协议。以下是我的非工作代码: protocol Listener: class { somethingHappened() } class ThingThatHa

我正在编写一个代码,它处理符合给定协议的任意类,我想将这些类存储在
集中。要做到这一点,它们需要符合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)
        }
    }
}
协议侦听器:类{
发生了什么事
}
类thingThathas侦听器{
var listeners=Set()
func addListener(侦听器:AnyObject){
如果让listener=listener作为散列{
//已经符合Hashable,太好了!
插入(侦听器)
}
否则{
hashableListener=SomeMagicHatAppliesDefaultHashable(侦听器)
insert(hashableListener)
}
}
}
这段代码有一些地方是不正确的;而
someMagicHattAppliesDefaultHashable
就是我不确定该怎么做的地方

对于这一部分,我考虑使用一个封装真实对象的代理类,该类将提供可散列的,但我相信Swift的代理能力是有限的


我在上看到了这些问题和答案,但我认为它们并不完全相同。

您必须对所有对象应用协议,但您对它们的实例变量一无所知。此外,您希望将具有Hashable实现的对象与没有实现的其他类混合。即使你找到了一种方法,我也会认为它效率低下。充其量,这将导致糟糕的设计。是的,哈希对象的混合似乎有点不合适,但我认为侦听器的数量总是足够小,因此效率低下的问题不应该成为一个因素。最终问题归结为“当我只知道任意对象符合给定的协议时,我如何将它们存储在一个集合中”-应该放弃集合的想法,并使用对象的ObjectIdentifier来知道什么是唯一的侦听器(即对象标识)。您必须对所有对象应用协议,但您对它们的实例变量一无所知。此外,您希望将具有Hashable实现的对象与其他没有实现的类混合。即使您找到了一种方法,我也会认为这是低效的。充其量,这将导致糟糕的设计。是的h、 哈希对象的混合似乎有点不合适,但我认为侦听器的数量将始终足够小,因此效率低下的问题不应成为一个因素。最终问题归结为“当我所知道的只是任意对象符合给定的协议时,如何将其存储在一个集合中?”“-也许应该放弃设定的想法,并使用对象的ObjectIdentifier来了解什么是唯一的侦听器(即对象标识)。