[swift-evolution] Method dispatching issue with subclasses implementing Equatable protocol.

Joe Groff jgroff at apple.com
Wed Jan 18 10:44:02 CST 2017


> On Jan 18, 2017, at 2:59 AM, Francisco Javier Fernández Toro via swift-evolution <swift-evolution at 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


More information about the swift-evolution mailing list