web-dev-qa-db-ja.com

NSCodingおよびNSObjectをサブクラス化するカスタムクラスに対して呼び出されないEquatableタイプのオーバーライドされた==関数

以下のFooBarクラスは、Equatableタイプの==関数をオーバーライドする必要があります。

ただし、containsオブジェクトの配列でFooBarを呼び出しても、カスタム==関数内のブレークポイントは呼び出されません。別の==関数がこのカスタム関数をオーバーライドしている可能性はありますか?

注:FooBarはNSCodingおよびNSObjectからサブクラス化する必要があるため、FooBarは次のエラーを引き起こすため、プロトコルとしてEquatableをリストしません。

'FooBar'のプロトコル 'Equatable'への冗長な適合性

func ==(lhs: FooBar, rhs: FooBar) -> Bool {
    return lhs.id == rhs.id
}

class FooBar: NSObject, NSCoding {
     // Class def
}

// Both serverFooBars and gFooBars are [FooBar]
let newFooBars = serverFooBars.filter { !gFooBars.contains($0) }
17
Crashalot

クラスはNSObjectから継承するため、SwiftプロトコルEquatableを使用する必要はありません。代わりに、NSObjectメソッドisEquals

Swift 3.x

class FooBar: NSObject, NSCoding {
  override func isEqual(_ object: Any?) -> Bool {
    return id == (object as? FooBar)?.id
  }
}

(カムチャツカに感謝)

Swift 2.x

class FooBar: NSObject, NSCoding {
  override func isEqual(object: AnyObject?) -> Bool {
    return id == (object as? FooBar)?.id
  }
}
50
Blake Lockley

NSObjectはisEqualメソッドを介してすでにEquatableに準拠しているため、このエラーが発生します。

したがって、これがこれを行う正しい方法であるかどうかはわかりませんが、NSObjectのisEqualメソッドをオーバーライドできます。

class FooBar: NSObject, NSCoding {
...

override func isEqual(object: AnyObject?) -> Bool {
    return self == (object as? FooBar)
}
4
Odrakir