重写== Equatable类型的函数未调用子类NSCoding和NSObject的自定义类

时间:2016-05-07 07:34:14

标签: swift nsobject nscoding 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) }

2 个答案:

答案 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)
}