<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">Hi everyone,<div class=""><br class=""></div><div class="">In swift, enums are much much more powerful than they used to be in c, c++ or objective-c.</div><div class="">One of their great feature is to be able to carry a payload.</div><div class="">Sadly, even a simple payload makes comparison much more complicated.</div><div class=""><br class=""></div><div class="">Consider this code :</div><div class="">----------------------------------------------------------------------</div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><div style="margin: 0px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #0433ff" class="">enum</span> MyEnum {</div><div style="margin: 0px; line-height: normal;" class="">&nbsp; <span style="font-variant-ligatures: no-common-ligatures; color: #0433ff" class="">case</span> One</div><div style="margin: 0px; line-height: normal;" class="">&nbsp; <span style="font-variant-ligatures: no-common-ligatures; color: #0433ff" class="">case</span> Two</div><div style="margin: 0px; line-height: normal;" class="">}</div><div style="margin: 0px; line-height: normal; min-height: 13px;" class=""><br class=""></div><div style="margin: 0px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #0433ff" class="">let</span> const1 = <span style="font-variant-ligatures: no-common-ligatures; color: #3495af" class="">MyEnum</span>.<span style="font-variant-ligatures: no-common-ligatures; color: #3495af" class="">One</span></div><div style="margin: 0px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #0433ff" class="">let</span> const1bis = <span style="font-variant-ligatures: no-common-ligatures; color: #3495af" class="">MyEnum</span>.<span style="font-variant-ligatures: no-common-ligatures; color: #3495af" class="">One</span></div><div style="margin: 0px; line-height: normal; min-height: 13px;" class=""><br class=""></div><div style="margin: 0px; line-height: normal; color: rgb(52, 149, 175);" class="">const1<span style="font-variant-ligatures: no-common-ligatures; color: #000000" class=""> </span>==<span style="font-variant-ligatures: no-common-ligatures; color: #000000" class=""> </span>const1bis<span style="font-variant-ligatures: no-common-ligatures; color: #000000" class=""> </span><span style="font-variant-ligatures: no-common-ligatures; color: #008f00" class="">// -&gt; true</span></div><div class=""><div style="font-family: Helvetica; font-size: 12px;" class="">----------------------------------------------------------------------</div><div style="font-family: Helvetica; font-size: 12px;" class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""></div></div></div><div class=""><span style="font-variant-ligatures: no-common-ligatures; color: #008f00" class=""><br class=""></span></div></div></div><div class="">It compiles fine, and is pretty concise.</div><div class=""><br class=""></div><div class="">Let’s add a payload to the enum</div><div class="">----------------------------------------------------------------------</div><div class=""><div style="margin: 0px; line-height: normal;" class=""><div style="font-family: Menlo; font-size: 11px; margin: 0px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #0433ff" class="">enum</span> MyEnumWithPayload {</div><div style="font-family: Menlo; font-size: 11px; margin: 0px; line-height: normal;" class="">&nbsp; <span style="font-variant-ligatures: no-common-ligatures; color: #0433ff" class="">case</span> One(payload: String)</div><div style="font-family: Menlo; font-size: 11px; margin: 0px; line-height: normal;" class="">&nbsp; <span style="font-variant-ligatures: no-common-ligatures; color: #0433ff" class="">case</span> Two(payload: String)</div><div style="font-family: Menlo; font-size: 11px; margin: 0px; line-height: normal;" class="">}</div><div style="font-family: Menlo; font-size: 11px; margin: 0px; line-height: normal; min-height: 13px;" class=""><br class=""></div><div style="font-family: Menlo; font-size: 11px; margin: 0px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #0433ff" class="">let</span> simplePayload = <span style="font-variant-ligatures: no-common-ligatures; color: #b4261a" class="">"test"</span></div><div style="font-family: Menlo; font-size: 11px; margin: 0px; line-height: normal; min-height: 13px;" class=""><br class=""></div><div style="font-family: Menlo; font-size: 11px; margin: 0px; line-height: normal; color: rgb(52, 149, 175);" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #0433ff" class="">let</span><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class=""> const1 = </span>MyEnumWithPayload<span style="font-variant-ligatures: no-common-ligatures; color: #000000" class="">.</span>One<span style="font-variant-ligatures: no-common-ligatures; color: #000000" class="">(payload: </span>simplePayload<span style="font-variant-ligatures: no-common-ligatures; color: #000000" class="">)</span></div><div style="font-family: Menlo; font-size: 11px; margin: 0px; line-height: normal; color: rgb(52, 149, 175);" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #0433ff" class="">let</span><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class=""> const1bis = </span>MyEnumWithPayload<span style="font-variant-ligatures: no-common-ligatures; color: #000000" class="">.</span>One<span style="font-variant-ligatures: no-common-ligatures; color: #000000" class="">(payload: </span>simplePayload<span style="font-variant-ligatures: no-common-ligatures; color: #000000" class="">)</span></div><div style="font-family: Menlo; font-size: 11px; margin: 0px; line-height: normal; min-height: 13px;" class=""><br class=""></div><div style="font-family: Menlo; font-size: 11px; margin: 0px; line-height: normal; color: rgb(0, 143, 0);" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #3495af" class="">const1</span><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class=""> == </span><span style="font-variant-ligatures: no-common-ligatures; color: #3495af" class="">const1bis</span><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class=""> </span>// error : Binary operator '==' cannot be applied to two MyEnumWithPayload operand</div><div class=""><div style="font-family: Helvetica; font-size: 12px;" class="">----------------------------------------------------------------------</div><div class="" style="font-family: Menlo; font-size: 11px;"><br class=""></div><div class="" style="font-family: Menlo; font-size: 11px;">This does not compile.</div><div class="" style="font-family: Menlo; font-size: 11px;">An equality operator is needed to handle that case :</div><div class="" style="font-family: Menlo; font-size: 11px;"><span style="font-family: Helvetica; font-size: 12px;" class="">----------------------------------------------------------------------&nbsp;</span></div><div style="font-family: Menlo; font-size: 11px; margin: 0px; line-height: normal; color: rgb(52, 149, 175);" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #0433ff" class="">func</span><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class=""> ==(leftToken: </span>MyEnumWithPayload<span style="font-variant-ligatures: no-common-ligatures; color: #000000" class="">, rightToken: </span>MyEnumWithPayload<span style="font-variant-ligatures: no-common-ligatures; color: #000000" class="">) -&gt; </span>Bool<span style="font-variant-ligatures: no-common-ligatures; color: #000000" class=""> {</span></div><div style="font-family: Menlo; font-size: 11px; margin: 0px; line-height: normal;" class="">&nbsp; <span style="font-variant-ligatures: no-common-ligatures; color: #0433ff" class="">var</span> result: <span style="font-variant-ligatures: no-common-ligatures; color: #3495af" class="">Bool</span> = <span style="font-variant-ligatures: no-common-ligatures; color: #0433ff" class="">false</span>;</div><p style="font-family: Menlo; font-size: 11px; margin: 0px; line-height: normal; min-height: 13px;" class="">&nbsp;&nbsp;<br class="webkit-block-placeholder"></p><div style="font-family: Menlo; font-size: 11px; margin: 0px; line-height: normal;" class="">&nbsp; <span style="font-variant-ligatures: no-common-ligatures; color: #0433ff" class="">switch</span>(leftToken, rightToken) {</div><div style="font-family: Menlo; font-size: 11px; margin: 0px; line-height: normal;" class="">&nbsp; <span style="font-variant-ligatures: no-common-ligatures; color: #0433ff" class="">case</span> (<span style="font-variant-ligatures: no-common-ligatures; color: #0433ff" class="">let</span> .One(leftPayload), <span style="font-variant-ligatures: no-common-ligatures; color: #0433ff" class="">let</span> .One(rightPayload)):</div><div style="font-family: Menlo; font-size: 11px; margin: 0px; line-height: normal;" class="">&nbsp; &nbsp; result = (leftPayload == rightPayload)</div><div style="font-family: Menlo; font-size: 11px; margin: 0px; line-height: normal;" class="">&nbsp; <span style="font-variant-ligatures: no-common-ligatures; color: #0433ff" class="">case</span> (<span style="font-variant-ligatures: no-common-ligatures; color: #0433ff" class="">let</span> .Two(leftPayload), <span style="font-variant-ligatures: no-common-ligatures; color: #0433ff" class="">let</span> .Two(rightPayload)):</div><div style="font-family: Menlo; font-size: 11px; margin: 0px; line-height: normal;" class="">&nbsp; &nbsp; result = (leftPayload == rightPayload)</div><div style="font-family: Menlo; font-size: 11px; margin: 0px; line-height: normal; color: rgb(4, 51, 255);" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class="">&nbsp; </span>default<span style="font-variant-ligatures: no-common-ligatures; color: #000000" class="">:</span></div><div style="font-family: Menlo; font-size: 11px; margin: 0px; line-height: normal;" class="">&nbsp; &nbsp; result = <span style="font-variant-ligatures: no-common-ligatures; color: #0433ff" class="">false</span>;</div><div style="font-family: Menlo; font-size: 11px; margin: 0px; line-height: normal;" class="">&nbsp; }</div><p style="font-family: Menlo; font-size: 11px; margin: 0px; line-height: normal; min-height: 13px;" class="">&nbsp;&nbsp;<br class="webkit-block-placeholder"></p><div style="font-family: Menlo; font-size: 11px; margin: 0px; line-height: normal;" class="">&nbsp; <span style="font-variant-ligatures: no-common-ligatures; color: #0433ff" class="">return</span> result;</div><div style="font-family: Menlo; font-size: 11px; margin: 0px; line-height: normal;" class="">}</div><div style="font-family: Menlo; font-size: 11px; margin: 0px; line-height: normal; color: rgb(52, 149, 175);" class=""><span style="font-family: Helvetica; font-size: 12px;" class="">----------------------------------------------------------------------&nbsp;</span></div><div class="" style="font-family: Menlo; font-size: 11px;"><span style="font-family: Helvetica; font-size: 12px;" class=""><br class=""></span></div><div class="" style="font-family: Menlo; font-size: 11px;"><span style="font-family: Helvetica; font-size: 12px;" class="">I have two concerns with that :</span></div><div class="" style="font-family: Menlo; font-size: 11px;"><span style="font-family: Helvetica; font-size: 12px;" class="">- the added code is much bigger than the declaration of the enum, and the added code is not that simple to read. It is pretty simple to understand, but I find it complex to read.</span></div><div class="" style="font-family: Menlo; font-size: 11px;"><span style="font-family: Helvetica; font-size: 12px;" class="">- we have to use a default, otherwise, the compiler complains that the enum is not exhaustive (my compiler is configured to treat warnings as errors). So if we add a new value to the enum, we will not get a compiler warning reminding us that we should deal with equality for the new case.</span></div><div class="" style="font-family: Menlo; font-size: 11px;"><span style="font-family: Helvetica; font-size: 12px;" class=""><br class=""></span></div><div class="" style="font-family: Menlo; font-size: 11px;"><span style="font-family: Helvetica; font-size: 12px;" class="">It would be great to have a default equality operator for enums with a payload, as we have for the simple enum.</span></div><div class="" style="font-family: Menlo; font-size: 11px;"><span style="font-family: Helvetica; font-size: 12px;" class="">The logic of it would be : if the case is the same, and the payload(s) of each operand are equal, then the two operands are equal.</span></div><div class="" style="font-family: Menlo; font-size: 11px;"><br class=""></div><div class="" style="font-family: Menlo; font-size: 11px;"><span style="font-family: Helvetica; font-size: 12px;" class="">Of course, an equality operator has to be defined for the types of the payloads.</span></div><div class="" style="font-family: Menlo; font-size: 11px;"><span style="font-family: Helvetica; font-size: 12px;" class=""><br class=""></span></div><div class="">Jerome</div><div class="" style="font-family: Menlo; font-size: 11px;"><br class=""></div><div style="font-family: Helvetica; font-size: 12px;" class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""></div></div></div></div></div></body></html>