<div dir="ltr"><div>Hi,</div><div><br></div><div>I&#39;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&#39;s not enough with ==. </div><div><br></div><div>If you don&#39;t define you own subclass != operator, Swift compiler will use the super class to resolve that operation.</div><div><br></div><div>Is there any reason for that?</div><div><br></div><div>Check the following code (<a href="https://gist.github.com/fjfdeztoro/a5097f1b24379e127674eb1df8c97d96">https://gist.github.com/fjfdeztoro/a5097f1b24379e127674eb1df8c97d96</a>):</div><div><br></div><div><br></div><div><font face="monospace, monospace">class Superclass : Equatable {</font></div><div><font face="monospace, monospace">    let foo: Int</font></div><div><font face="monospace, monospace">    </font></div><div><font face="monospace, monospace">    init(foo: Int) { self.foo = foo }</font></div><div><font face="monospace, monospace">    </font></div><div><font face="monospace, monospace">    func equal(to: Superclass) -&gt; Bool {</font></div><div><font face="monospace, monospace">        return foo == to.foo</font></div><div><font face="monospace, monospace">    }</font></div><div><font face="monospace, monospace">}</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">func == (lhs: Superclass, rhs: Superclass) -&gt; Bool {</font></div><div><font face="monospace, monospace">    return lhs.equal(to: rhs)</font></div><div><font face="monospace, monospace">}</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">class Subclass: Superclass {</font></div><div><font face="monospace, monospace">    let bar: Int</font></div><div><font face="monospace, monospace">    init(foo: Int, bar: Int) {</font></div><div><font face="monospace, monospace">        self.bar = bar</font></div><div><font face="monospace, monospace">        super.init(foo: foo)</font></div><div><font face="monospace, monospace">    }</font></div><div><font face="monospace, monospace">    </font></div><div><font face="monospace, monospace">    func equal(to: Subclass) -&gt; Bool {</font></div><div><font face="monospace, monospace">        return bar == to.bar &amp;&amp; super.equal(to: to)</font></div><div><font face="monospace, monospace">    }</font></div><div><font face="monospace, monospace">}</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">func == (lhs: Subclass, rhs: Subclass) -&gt; Bool {</font></div><div><font face="monospace, monospace">    return lhs.equal(to: rhs)</font></div><div><font face="monospace, monospace">}</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">class SubclassWithDifferentOperator: Subclass {}</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">func != (lhs: SubclassWithDifferentOperator, rhs: SubclassWithDifferentOperator) -&gt; Bool {</font></div><div><font face="monospace, monospace">    return !lhs.equal(to: rhs)</font></div><div><font face="monospace, monospace">}</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">let a = Subclass(foo: 1, bar: 1)</font></div><div><font face="monospace, monospace">let b = Subclass(foo: 1, bar: 2)</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">(a == b) != (a != b) // Prints: False</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">let x = SubclassWithDifferentOperator(foo: 1, bar: 1)</font></div><div><font face="monospace, monospace">let y = SubclassWithDifferentOperator(foo: 1, bar: 2)</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">(x == y) != (x != y) // Prints: True</font></div><div><br></div><div>---</div><div><br></div><div>Fran Fernandez.</div></div>