下面的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) }
答案 0 :(得分:38)
由于您的类继承自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
}
}
答案 1 :(得分:3)
您收到此错误是因为NSObject已通过其isEqual方法符合Equatable。
所以我不确定这是否是正确的方法,但你可以覆盖NSObject的isEqual方法:
class FooBar: NSObject, NSCoding {
...
override func isEqual(object: AnyObject?) -> Bool {
return self == (object as? FooBar)
}