以下の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) }
クラスは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
}
}
NSObjectはisEqualメソッドを介してすでにEquatableに準拠しているため、このエラーが発生します。
したがって、これがこれを行う正しい方法であるかどうかはわかりませんが、NSObjectのisEqualメソッドをオーバーライドできます。
class FooBar: NSObject, NSCoding {
...
override func isEqual(object: AnyObject?) -> Bool {
return self == (object as? FooBar)
}