不为自定义 class 调用 Equatable 类型的覆盖 == 函数,subclass 是 NSCoding 和 NSObject

Overridden == function for Equatable type not called for custom class that subclasses NSCoding and NSObject

下面的FooBarclass必须覆盖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)
}