3

プロトコル 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 は Equatable ではなく、Equatable にする方法がわからないため、find メソッドでエラーが発生します。誰かが修正または別のアプローチの提案で私を助けることができますか?

ありがとう

4

2 に答える 2

4

プロトコルを実装するすべての型が参照型(クラス) であると仮定すると 、プロトコルを「クラス プロトコル」として宣言できます。

public protocol JABPanelChangeSubscriber : class {

}

同一性演算子を使用し===て、指定された引数と同じインスタンスを指す要素が配列に既に含まれているかどうかを確認します。

public func addSubscriber(subscriber: JABPanelChangeSubscriber) {
    if !contains(subscribers, { $0 === subscriber } ) {
        subscribers.append(subscriber)
    }
}
于 2015-05-20T08:36:44.270 に答える
0

isEqualTo(:)要件をJABPanelChangeSubscriber プロトコルに追加

public protocol JABPanelChangeSubscriber {
    func isEqualTo(other: JABPanelChangeSubscriber) -> Bool
}

要件のJABPanelChangeSubscriberあるプロトコルへの拡張Self

extension JABPanelChangeSubscriber where Self: Equatable {
   func isEqualTo(other: JABPanelChangeSubscriber) -> Bool {
      guard let other = other as? Self else { return false }
        return self == other
   }
}

オブジェクトEquatableもプロトコルに準拠させることを忘れないでください

class SomeClass: Equatable {}
func == (lhs: SomeClass, rhs: SomeClass) -> Bool {
//your code here
//you could use `===` operand
}

struct SomeStruct: Equatable {}
func == (lhs: SomeStruct, rhs: SomeStruct) -> Bool {
//your code here
}

次に、インデックスを見つけます

func indexOf(object: JABPanelChangeSubscriber) -> Int? {
    return subcribers.indexOf({ $0.isEqualTo(object) })
}

オブジェクトを配列に追加する前にオブジェクトの存在を確認したい場合

func addSubscriber(subscriber: JABPanelChangeSubscriber) {
    if !subscribers.contains({ $0.isEqualTo(subscriber) }) {
        subscribers.append(subscriber)
    }
}
于 2016-07-07T03:11:13.687 に答える