<div dir="ltr">Thank you for your answer Joe,<div><br></div><div>you are right the <font face="monospace, monospace">equal(to:)</font> wasn&#39;t a valid override, but even after using the one you&#39;ve proposed, the behavior is not the expected one</div><div><br></div><div><br></div><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 true</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 false</font></div><div><br></div><div>As you can see above if a subclass does not implement the global function <font face="monospace, monospace">!=</font>, the equal operation seems to be broken.</div><div><br></div><div>---</div><div><br></div><div>Fran Fernandez</div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Jan 18, 2017 at 5:44 PM, Joe Groff <span dir="ltr">&lt;<a href="mailto:jgroff@apple.com" target="_blank">jgroff@apple.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><span class="gmail-"><br>
&gt; On Jan 18, 2017, at 2:59 AM, Francisco Javier Fernández Toro via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br>
&gt;<br>
&gt; Hi,<br>
&gt;<br>
&gt; 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 ==.<br>
&gt;<br>
&gt; If you don&#39;t define you own subclass != operator, Swift compiler will use the super class to resolve that operation.<br>
&gt;<br>
&gt; Is there any reason for that?<br>
<br>
</span>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:<br>
<span class="gmail-"><br>
class Subclass: Superclass {<br>
    let bar: Int<br>
    init(foo: Int, bar: Int) {<br>
        self.bar = bar<br>
        super.init(foo: foo)<br>
    }<br>
<br>
</span>    override func equal(to: Superclass) -&gt; Bool {<br>
      if let toSub = to as? Subclass {<br>
        return bar == toSub.bar &amp;&amp; super.equal(to: to)<br>
      }<br>
      return false<br>
    }<br>
}<br>
<br>
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 <a href="http://bugs.swift.org" rel="noreferrer" target="_blank">bugs.swift.org</a> about that?<br>
<span class="gmail-HOEnZb"><font color="#888888"><br>
-Joe</font></span></blockquote></div><br></div></div></div>