<div dir="ltr"><div class="gmail_default" style="font-family:georgia,serif"><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 style="font-family:arial,sans-serif;font-size:13px">There is no reason to compare the shape, it is a constant in each of</span></blockquote><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 style="font-family:arial,sans-serif;font-size:13px">these types.  (So I am not sure what your point is.)</span></blockquote><div><br></div><div>Sorry. The `let shape` should be `var shape`. I just wanted to make the subclass to be something more than the super class.</div><div><br></div><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 style="font-family:arial,sans-serif;font-size:13px">If two values are equal, their hash values should be equal.  As long<br></span><span style="font-family:arial,sans-serif;font-size:13px">as your override implementation guarantees this, you can override<br></span><span style="font-family:arial,sans-serif;font-size:13px">hashValue.</span></blockquote><div><br></div><div>But the question is how? If this must be guaranteed by the subclass, how to writing the override? Or it just can&#39;t be done?</div><div><br></div><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 style="font-family:arial,sans-serif;font-size:13px">You should also understand that the ==(Apple, Apple) and ==(Banana,<br></span><span style="font-family:arial,sans-serif;font-size:13px">Banana) are not overrides for ==(Fruit, Fruit), and they would not be<br></span><span style="font-family:arial,sans-serif;font-size:13px">called through dynamic dispatch when you have, for example, two apples<br></span><span style="font-family:arial,sans-serif;font-size:13px">typed as fruits.</span></blockquote><div><br></div><div>In fact, in my example code, `apple` and `banana` is instance of `Apple` and `Banana`. They are not using `let apple:Fruit = Apple()`. The `==` used the <b>`Fruit` version</b> as it was the only appropriate one. My big question is, since they used the `<b>Fruit` version</b>, and the <b>`Fruit` version of `hashValue`</b> could guarantee the `hashValue` equality, isn&#39;t that enough?</div><div><br></div><div>Zhaoxin</div><div> </div></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sat, Sep 3, 2016 at 7:02 AM, Dmitri Gribenko <span dir="ltr">&lt;<a href="mailto:gribozavr@gmail.com" target="_blank">gribozavr@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">On Sat, Sep 3, 2016 at 1:31 AM, Zhao Xin via swift-users<br>
&lt;<a href="mailto:swift-users@swift.org">swift-users@swift.org</a>&gt; wrote:<br>
&gt; func ==(lhs: Apple, rhs: Apple) -&gt; Bool {<br>
&gt;     return <a href="http://lhs.name" rel="noreferrer" target="_blank">lhs.name</a> == <a href="http://rhs.name" rel="noreferrer" target="_blank">rhs.name</a> &amp;&amp; lhs.shape == rhs.shape<br>
&gt; }<br>
&gt;<br>
&gt; func ==(lhs: Banana, rhs: Banana) -&gt; Bool {<br>
&gt;     return <a href="http://lhs.name" rel="noreferrer" target="_blank">lhs.name</a> == <a href="http://rhs.name" rel="noreferrer" target="_blank">rhs.name</a> &amp;&amp; lhs.shape == rhs.shape<br>
&gt; }<br>
<br>
</span>There is no reason to compare the shape, it is a constant in each of<br>
these types.  (So I am not sure what your point is.)<br>
<span class=""><br>
&gt; My question is, apple equals banana, but their hashValues (in their own<br>
&gt; types)  don&#39;t. What&#39;s wrong here? Is that means we shouldn&#39;t override<br>
&gt; hashValue in subclass in Swift?<br>
<br>
</span>This means you should not override hashValue in this particular way.<br>
If two values are equal, their hash values should be equal.  As long<br>
as your override implementation guarantees this, you can override<br>
hashValue.<br>
<br>
You should also understand that the ==(Apple, Apple) and ==(Banana,<br>
Banana) are not overrides for ==(Fruit, Fruit), and they would not be<br>
called through dynamic dispatch when you have, for example, two apples<br>
typed as fruits.<br>
<span class="HOEnZb"><font color="#888888"><br>
Dmitri<br>
<br>
--<br>
main(i,j){for(i=2;;i++){for(j=<wbr>2;j&lt;i;j++){if(!(i%j)){j=0;<wbr>break;}}if<br>
(j){printf(&quot;%d\n&quot;,i);}}} /*Dmitri Gribenko &lt;<a href="mailto:gribozavr@gmail.com">gribozavr@gmail.com</a>&gt;*/<br>
</font></span></blockquote></div><br></div>