Arrays 在[SomeProtocol]类型的数组中查找对象的索引

Arrays 在[SomeProtocol]类型的数组中查找对象的索引,arrays,xcode,swift,protocols,iequatable,Arrays,Xcode,Swift,Protocols,Iequatable,我有一个名为订阅服务器的数组,它存储符合订阅服务器协议的对象。协议声明为 public protocol JABPanelChangeSubscriber { } 我的数组声明为: var subscribers = [JABPanelChangeSubscriber]() 现在我需要实现一个方法来将订阅者添加到列表中,但它首先必须检查该订阅者之前是否还没有被添加 public func addSubscriber(subscriber: JABPanelChangeSubscriber)

我有一个名为订阅服务器的数组,它存储符合订阅服务器协议的对象。协议声明为

public protocol JABPanelChangeSubscriber {

}
我的数组声明为:

var subscribers = [JABPanelChangeSubscriber]()
现在我需要实现一个方法来将订阅者添加到列表中,但它首先必须检查该订阅者之前是否还没有被添加

public func addSubscriber(subscriber: JABPanelChangeSubscriber) {
    if subscribers.find(subscriber) == nil { // This ensures that the subscriber has never been added before
        subscribers.append(subscriber)
    }
}
不幸的是,JABPanelChangeSubscriber是不可等额的,我无法找出如何使其可等额,因此find方法给了我一个错误。有人能帮我解决问题,或者给我一个不同方法的建议吗


谢谢

假设实现协议的所有类型都是引用类型 (类),可以将协议声明为“类协议”

并使用标识运算符
==
检查数组是否已存在 包含指向与给定参数相同实例的元素:

public func addSubscriber(subscriber: JABPanelChangeSubscriber) {
    if !contains(subscribers, { $0 === subscriber } ) {
        subscribers.append(subscriber)
    }
}
isEqualTo(:)
要求添加到
订户
协议

public protocol JABPanelChangeSubscriber {
    func isEqualTo(other: JABPanelChangeSubscriber) -> Bool
}
扩展到具有
Self
要求的
subscriber
协议

extension JABPanelChangeSubscriber where Self: Equatable {
   func isEqualTo(other: JABPanelChangeSubscriber) -> Bool {
      guard let other = other as? Self else { return false }
        return self == other
   }
}
记住让对象也符合
协议

然后找到索引

func indexOf(object: JABPanelChangeSubscriber) -> Int? {
    return subcribers.indexOf({ $0.isEqualTo(object) })
}
如果要在将对象添加到数组之前检查对象是否存在

func addSubscriber(subscriber: JABPanelChangeSubscriber) {
    if !subscribers.contains({ $0.isEqualTo(subscriber) }) {
        subscribers.append(subscriber)
    }
}

为什么要使用订阅服务器.find()
?除非您为
Array
编写了扩展,否则我认为默认的
Array
没有
find()
方法。
func indexOf(object: JABPanelChangeSubscriber) -> Int? {
    return subcribers.indexOf({ $0.isEqualTo(object) })
}
func addSubscriber(subscriber: JABPanelChangeSubscriber) {
    if !subscribers.contains({ $0.isEqualTo(subscriber) }) {
        subscribers.append(subscriber)
    }
}