iOS-Swift-将protocol协议添加到set集合中

协议protocol一般用来做回调监听,当多个地方需要添加回调监听时,就要用Set集合来管理,Set中的元素需要实现Hashable方法,而协议protocol是不能实现Hashable方法的,会报如下错误。

Protocol 'MyProtocol' as a type cannot conform to 'Hashable'

截屏2021-10-31 下午5.23.27.png

解决这个问题需要转换一下思路。protocol不能实现Hashable方法,但是protocol的实现类完全可以实现Hashable,那么我们不应该用Set保存,而是用Set,添加删除监听时操作Set,遍历监听时通过compactMap将AnyHashable转换成MyProtocol,示例如下:


protocol MyProtocol: NSObjectProtocol {
    func foo()
}

var protocols: Set<AnyHashable> = []

var protocolList: [MyProtocol] {
    return protocols.compactMap { $0 as? MyProtocol }
}

func addOne(_ p: AnyHashable) {
    protocols.insert(p)
}

func removeOne(_ p: AnyHashable) {
    protocols.remove(p)
}

func notifyAll() {
    for p in protocolList {
        p.foo()
    }
}

class MyView: UIView, MyProtocol {
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        addOne(self)
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    func foo() {
        
    }
}
posted @ 2022-07-18 17:45  rome753  阅读(132)  评论(0编辑  收藏  举报