假设我有五个UIView对象,它们都符合特定协议。我有一个对象,该对象应维护这些对象的列表,并在必要时向它们发送所有消息。

protocol MyProtocol: AnyObject {
    func doSomething()
}

问题是,当我将这些UIView添加到Set变量时,编译器会产生错误,因为MyProtocol不符合Hashable。我能理解其原因,有人能想到克服此问题的好方法吗?同时,我考虑改用NSHashTable,但您却失去了Sets的出色枚举功能。

更新答案以发布一些示例代码(这仍然无法正常工作)
protocol MyProtocol: class, AnyObject {
    func doSomething()
}

class MyClass {
    var observers: Set<MyProtocol> = Set<MyProtocol>()
}

最佳答案

当您为类定义协议时,因此您需要在继承任何其他协议之前编写“class”关键字:

    protocol MyProtocol: AnyObject, Hashable{
         func doSomething()
    }


    class MyClass<T: MyProtocol> {

         var observers: Set<T> = Set<T>()
    }

将您的协议更改为此,它将正常工作。
您可以参考Apple Documentation以获得更多详细信息。

10-08 05:27