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?

Check the following code (
https://gist.github.com/fjfdeztoro/a5097f1b24379e127674eb1df8c97d96):


class Superclass : Equatable {
    let foo: Int

    init(foo: Int) { self.foo = foo }

    func equal(to: Superclass) -> Bool {
        return foo == to.foo
    }
}

func == (lhs: Superclass, rhs: Superclass) -> Bool {
    return lhs.equal(to: rhs)
}

class Subclass: Superclass {
    let bar: Int
    init(foo: Int, bar: Int) {
        self.bar = bar
        super.init(foo: foo)
    }

    func equal(to: Subclass) -> Bool {
        return bar == to.bar && super.equal(to: to)
    }
}

func == (lhs: Subclass, rhs: Subclass) -> Bool {
    return lhs.equal(to: rhs)
}

class SubclassWithDifferentOperator: Subclass {}

func != (lhs: SubclassWithDifferentOperator, rhs:
SubclassWithDifferentOperator) -> Bool {
    return !lhs.equal(to: rhs)
}

let a = Subclass(foo: 1, bar: 1)
let b = Subclass(foo: 1, bar: 2)

(a == b) != (a != b) // Prints: False

let x = SubclassWithDifferentOperator(foo: 1, bar: 1)
let y = SubclassWithDifferentOperator(foo: 1, bar: 2)

(x == y) != (x != y) // Prints: True

---

Fran Fernandez.
_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution
  • [swift-evolution] Met... Francisco Javier Fernández Toro via swift-evolution
    • Re: [swift-evolu... Joe Groff via swift-evolution
      • Re: [swift-e... Francisco Javier Fernández Toro via swift-evolution
        • Re: [swi... Tony Allevato via swift-evolution
          • Re: ... Francisco Javier Fernández Toro via swift-evolution
            • ... Tony Allevato via swift-evolution
              • ... Francisco Javier Fernández Toro via swift-evolution
                • ... Pierre Monod-Broca via swift-evolution
                • ... Goffredo Marocchi via swift-evolution
                • ... Karl Wagner via swift-evolution
                • ... Pierre Monod-Broca via swift-evolution

Reply via email to