<div dir="ltr">Just stumbled upon the question whether enums/structs should automatically conform to <font face="monospace, monospace">Equatable</font> when the conformance is declared indirectly through another protocol. This can be unexpected for the developer when declaring conformance to a protocol of another developer.<div><br></div><div><font face="monospace, monospace">protocol YourProtocol: Equatable {}</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">// implicitly declares conformance to Equatable - should equality operator be generated or not?</font></div><div><font face="monospace, monospace">enum MyEnum: YourProtocol {}</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">// better require explicit declaration to </font><span style="font-family:monospace,monospace">automatically create</span><font face="monospace, monospace"> equality operator and avoid unexpected behavior</font></div><div><font face="monospace, monospace">enum MyEnum: Equatable, YourProtocol {}</font><br></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">// same for Hashable</font></div><div><span style="font-family:monospace,monospace">enum MyEnum: Hashable {} // should raise a error since Equatable isn&#39;t satisfied</span><font face="monospace, monospace"><br></font></div><div><span style="font-family:monospace,monospace"><br></span></div><div><span style="font-family:monospace,monospace">// must also be explicit to automatically create equality operator</span></div><div><span style="font-family:monospace,monospace">enum MyEnum: Equatable, Hashable {}</span><span style="font-family:monospace,monospace"><br></span></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Dec 11, 2015 at 6:09 PM, Jonathan Hise Kaldma via swift-evolution <span dir="ltr">&lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="auto"><div>+1</div><div><br></div><div>Would love to see this.<br><br>/Jonathan</div><div><div class="h5"><div><br>11 dec. 2015 kl. 17:37 skrev Slava Pestov via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt;:<br><br></div><blockquote type="cite"><div>This could be implemented by extending the derived conformance logic in Sema. Right now it only derives Equatable for enums without payload cases, but it would be relatively straightforward to synthesize the obvious Equatable conformance if all payloads are themselves Equatable, or tuples of Equatable types. You would then just write<div><br></div><div>extension MyEnumWithPayload : Equatable {}</div><div><br></div><div>Ditto for Hashable.</div><div><br></div><div>Slava</div><div><br><div><blockquote type="cite"><div>On Dec 11, 2015, at 8:15 AM, Marc Knaup via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt; wrote:</div><br><div><div dir="ltr">It&#39;s a similar discussion with simple structs which could automatically be equatable.<div>And for Hashable.<br><div>It&#39;s difficult to draw a line where that makes sense and where not.<div><br></div><div>In any case I&#39;d prefer to not have recursive equality automatically.</div><div><ul><li>It can easily lead to unexpected behavior when you forget to implement an own equality operator in order to remove variables from the equation which do not affect the equality.</li><li>You could add another variable to an existing enum (or struct) which is now automatically compared for equality without you noticing and which might be wrong.</li><li>You cannot opt out of that behavior.</li></ul></div><div>But I agree that the current implementations of the equality operator for enums are awful.</div><div>Maybe we can make the enum (or struct) conform to a special protocol which allows it to automatically generate the equality operator (and even default hashValue).</div><div><br></div><div>Something like this:</div><div><span><br></span></div><div><font face="monospace, monospace"><span>protocol </span></font><span style="font-family:monospace,monospace">DefaultEquatable: Equatable {}</span></div><div><span style="font-family:monospace,monospace">protocol DefaultHashable: Hashable {}</span></div><div><font face="monospace, monospace"><span><br></span></font></div><div><font face="monospace, monospace"><span>enum</span><span> MyEnumWithPayload: </span><span>DefaultEquatable</span><span>, </span><span>DefaultHashable</span><span> {<br></span><span>    case</span><span> One(payload: String)<br></span><span>    case</span><span> Two(payload: String)<br>}</span></font></div><div><br></div></div></div></div>
<img src="https://u2002410.ct.sendgrid.net/wf/open?upn=NLTid1W7V2mxBEfr5Y3KfTntaxSmOQp5vjACZc9Eh19BsqU-2BFXIWDrf5TDlzGqZnbJpN6BCu-2BXDgamCC28lyGWZkyCLcilXTIuvHM-2FS9VbeSa3ZxY4p0LD0iTo4FDTyjrdJDzBMIyONu7TSghNBYkSSOt-2BOqtuPG4xZuZfYO8-2F68Cvw6GhthuPJTbwessHTbFKvl1NzQ4hL3R9F2WDb9Afmz7NzvNj-2FES1z8jVRAGwc-3D" alt="" width="1" height="1" border="0" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important">
_______________________________________________<br>swift-evolution mailing list<br><a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a><br><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br></div></blockquote></div><br></div>
<img src="https://u2002410.ct.sendgrid.net/wf/open?upn=3H-2Bjq6g-2FrmhPdZznzzcOM7hJzszzEydjVMmbmBFWR95GeBzw-2F1Uioih7FVuLuHLSKKJSIoKVNSHqTqLyuh1xBb5sORmticOlumMLIiF070LI0QHr8SX-2FbEVSWBx67WG2htA-2FqQvgRC0ETX-2F2y6EhsjWdd4GiKVmqUStFFu2NfNv-2BlRDFX0lnFWucWPDCJkE4gAaIhsx8pqQH46g6ztQC6sUKkzjjwo-2FLLUhQJmh-2BLhA-3D" alt="" width="1" height="1" border="0" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important">

</div></blockquote><blockquote type="cite"><div><span>_______________________________________________</span><br><span>swift-evolution mailing list</span><br><span><a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a></span><br><span><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a></span><br></div></blockquote>
</div></div><img src="https://u2002410.ct.sendgrid.net/wf/open?upn=6ZGE61OxINd5lLe2xYh9Ku-2BXbixWNr2nvfzp2IB1sZiSn0gUvATsUB-2BdxyFRKm5YmMYm-2FuQw2I2z3XgnRPrxClyt3GFwAOK6udR-2Flydb8CVFG4TSU-2FW7T6K2BpDmcWRcoPf7Ah4QejsyD7Gce5zD5HUdMCSw6tSzC-2Bjh7An5ohOaWBiSn62O8Z4q83eQX9c89XErVnDv11yTRescAIsIogxv1LXwRHyqdO-2FGe2713PA-3D" alt="" width="1" height="1" border="0" style="min-height:1px!important;width:1px!important;border-width:0!important;margin-top:0!important;margin-bottom:0!important;margin-right:0!important;margin-left:0!important;padding-top:0!important;padding-bottom:0!important;padding-right:0!important;padding-left:0!important">
</div>
<br>_______________________________________________<br>
swift-evolution mailing list<br>
<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br>
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
<br></blockquote></div><br></div>