不为自定义 class 调用 Equatable 类型的覆盖 == 函数,subclass 是 NSCoding 和 NSObject
Overridden == function for Equatable type not called for custom class that subclasses NSCoding and NSObject
下面的FooBar
class必须覆盖Equatable
类型的==
函数。
但是,在 FooBar
对象数组上调用 contains
不会导致调用自定义 ==
函数内的断点。是否有可能另一个 ==
函数覆盖了这个自定义函数?
注意:因为 FooBar 必须从 NSCoding 和 NSObject 子class,所以 FooBar 没有将 Equatable 列为协议,因为它会导致此错误:
Redundant conformance of 'FooBar' to protocol '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([=11=]) }
因为你的 class 继承自 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)
}
下面的FooBar
class必须覆盖Equatable
类型的==
函数。
但是,在 FooBar
对象数组上调用 contains
不会导致调用自定义 ==
函数内的断点。是否有可能另一个 ==
函数覆盖了这个自定义函数?
注意:因为 FooBar 必须从 NSCoding 和 NSObject 子class,所以 FooBar 没有将 Equatable 列为协议,因为它会导致此错误:
Redundant conformance of 'FooBar' to protocol '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([=11=]) }
因为你的 class 继承自 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)
}