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

标签 arrays xcode swift protocols iequatable

我有一个名为 subscribers 的数组,它存储符合 JABPanelChangeSubscriber 协议(protocol)的对象。协议(protocol)声明为

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 不是 Equatable,我不知道如何让它 Equatable,所以 find 方法给我一个错误。谁能帮我解决问题或提出不同方法的建议?

谢谢

最佳答案

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

public protocol JABPanelChangeSubscriber : class {

}

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

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

关于arrays - 在 [SomeProtocol] 类型的数组中查找对象的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30344222/

相关文章:

xcode - 如何在 XCODE 4 上设置 SDL?

iOS : Swift - How to add pinpoint to map on touch and get detailed address of that location?

ios - Objective C 到 Swift - DoWithBlock

c++ - 如何使用数组解决这个问题?

javascript - 通过引用传递?

java - 尝试使用 BufferedReader 从 System.in 读取输入并将其放入数组中,但似乎不想给我数组

ios - Swift 按钮按下复制文本

c++ - Int 数组上的归并排序 C++

java - Libgdx & RoboVM 到应用商店

swift - Firebase 将数据存储到根目录