> On Jan 18, 2017, at 2:59 AM, Francisco Javier Fernández Toro via > swift-evolution <swift-evolution@swift.org> wrote: > > Hi, > > I've found that when you have a class hierarchy which implements Equatable, > if you want to have the != operator working as expected, you need to override > it, it's not enough with ==. > > If you don't define you own subclass != operator, Swift compiler will use the > super class to resolve that operation. > > Is there any reason for that?
The `equal(to:)` method inside `Subclass` is not a valid override of `Superclass` because its argument only accepts `Subclass` instances, but the parent method needs to work with all `Superclass` instances. If you write it as an override, it should work: class Subclass: Superclass { let bar: Int init(foo: Int, bar: Int) { self.bar = bar super.init(foo: foo) } override func equal(to: Superclass) -> Bool { if let toSub = to as? Subclass { return bar == toSub.bar && super.equal(to: to) } return false } } We should probably raise an error, or at least a warning, instead of silently accepting your code as an overload. Would you be able to file a bug on bugs.swift.org about that? -Joe _______________________________________________ swift-evolution mailing list swift-evolution@swift.org https://lists.swift.org/mailman/listinfo/swift-evolution