<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=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #0433ff" class=""><div style="color: rgb(0, 0, 0); font-family: HelveticaNeue; font-size: 17px;" class=""><b class="">Summary</b></div><div style="color: rgb(0, 0, 0); font-family: HelveticaNeue; font-size: 12px;" class="">The aim of this proposal is to offer a new syntax to ease some uses of enums with payload.</div><div style="color: rgb(0, 0, 0); font-family: HelveticaNeue; font-size: 12px;" class=""><br class=""></div><div style="color: rgb(0, 0, 0); font-family: HelveticaNeue; font-size: 17px;" class=""><b class="">Situation to improve:</b></div><div style="color: rgb(0, 0, 0); font-family: HelveticaNeue; font-size: 12px;" class="">Enums makes it possible to have explicate typing where it was not possible before. A classic example of that is filling a dictionary with data coming from a file or a stream (json, plist, …) : the types of possible values is finite : arrays, dicts, int, double, bool or string for json for exemple.</div><div style="color: rgb(0, 0, 0); font-family: HelveticaNeue; font-size: 12px;" class="">An enum can represent this finite range of possible types, its make the code and the API more self-documented.</div><div style="color: rgb(0, 0, 0); font-family: HelveticaNeue; font-size: 12px;" class="">Then, you have two possibilities to deal with this enum:</div><div style="color: rgb(0, 0, 0); font-family: HelveticaNeue; font-size: 12px;" class="">- using switch statements</div><div style="color: rgb(0, 0, 0); font-family: HelveticaNeue; font-size: 12px;" class="">- using the if case syntax introduced by swift 2</div><div style="color: rgb(0, 0, 0); font-family: HelveticaNeue; font-size: 12px;" class=""><br class=""></div><div style="color: rgb(0, 0, 0); font-family: HelveticaNeue; font-size: 12px;" class="">The drawback is that those two solutions can lead to writing code with high visual complexity, even though the logic behind is pretty simple.</div><div style="color: rgb(0, 0, 0); font-family: HelveticaNeue; font-size: 12px;" class=""><br class=""></div><div style="color: rgb(0, 0, 0); font-family: HelveticaNeue; font-size: 12px;" class="">Consider this example of a data dictionary, that a web service could have returned:</div><div style="color: rgb(0, 0, 0); font-family: HelveticaNeue; font-size: 12px;" class="">- book</div><div style="color: rgb(0, 0, 0); font-family: HelveticaNeue; font-size: 12px;" class="">&nbsp; - title:&nbsp;</div><div style="color: rgb(0, 0, 0); font-family: HelveticaNeue; font-size: 12px;" class="">&nbsp; - author:</div><div style="color: rgb(0, 0, 0); font-family: HelveticaNeue; font-size: 12px;" class="">&nbsp; &nbsp; - name: Apple</div><div style="color: rgb(0, 0, 0); font-family: HelveticaNeue; font-size: 12px;" class="">&nbsp; &nbsp; - age: 40</div><div style="color: rgb(0, 0, 0); font-family: HelveticaNeue; font-size: 12px;" class=""><br class=""></div><div style="color: rgb(0, 0, 0); font-family: HelveticaNeue; font-size: 12px;" class="">We can decode this in a variable of type [String:Value], where Value is:</div><div class=""><br class=""></div></span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #0433ff" class="">enum</span><span style="font-variant-ligatures: no-common-ligatures" class=""> Value {</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">&nbsp; </span><span style="font-variant-ligatures: no-common-ligatures; color: #0433ff" class="">case</span><span style="font-variant-ligatures: no-common-ligatures" class=""> integer(value: </span><span style="font-variant-ligatures: no-common-ligatures; color: #3495af" class="">Int</span><span style="font-variant-ligatures: no-common-ligatures" class="">)</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">&nbsp; </span><span style="font-variant-ligatures: no-common-ligatures; color: #0433ff" class="">case</span><span style="font-variant-ligatures: no-common-ligatures" class=""> string(value: </span><span style="font-variant-ligatures: no-common-ligatures; color: #3495af" class="">String</span><span style="font-variant-ligatures: no-common-ligatures" class="">)</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">&nbsp; </span><span style="font-variant-ligatures: no-common-ligatures; color: #0433ff" class="">case</span><span style="font-variant-ligatures: no-common-ligatures" class=""> dict(value: [</span><span style="font-variant-ligatures: no-common-ligatures; color: #3495af" class="">String</span><span style="font-variant-ligatures: no-common-ligatures" class="">:</span><span style="font-variant-ligatures: no-common-ligatures; color: #3495af" class="">Value</span><span style="font-variant-ligatures: no-common-ligatures" class="">])</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">&nbsp; </span><span style="font-variant-ligatures: no-common-ligatures; color: #0433ff" class="">case</span><span style="font-variant-ligatures: no-common-ligatures" class=""> null</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">}</span></div><div class=""><span style="font-variant-ligatures: no-common-ligatures" class=""><br class=""></span></div><div class="">Here is a snippet of code to access the age of the author:</div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #0433ff" class=""><br class=""></span></div><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="">if</span><span style="font-variant-ligatures: no-common-ligatures" class=""> </span><span style="font-variant-ligatures: no-common-ligatures; color: #0433ff" class="">case</span><span style="font-variant-ligatures: no-common-ligatures" class=""> .dict(let book) = data {</span></div><div style="margin: 0px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">&nbsp; </span><span style="font-variant-ligatures: no-common-ligatures; color: #0433ff" class="">if</span><span style="font-variant-ligatures: no-common-ligatures" class=""> </span><span style="font-variant-ligatures: no-common-ligatures; color: #0433ff" class="">case</span><span style="font-variant-ligatures: no-common-ligatures" class=""> .dict(let author) = book[</span><span style="font-variant-ligatures: no-common-ligatures; color: #b4261a" class="">"author"</span><span style="font-variant-ligatures: no-common-ligatures" class="">] ?? .null {</span></div><div style="margin: 0px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">&nbsp; &nbsp; </span><span style="font-variant-ligatures: no-common-ligatures; color: #0433ff" class="">if</span><span style="font-variant-ligatures: no-common-ligatures" class=""> </span><span style="font-variant-ligatures: no-common-ligatures; color: #0433ff" class="">case</span><span style="font-variant-ligatures: no-common-ligatures" class=""> .integer(let age) = author[</span><span style="font-variant-ligatures: no-common-ligatures; color: #b4261a" class="">"age"</span><span style="font-variant-ligatures: no-common-ligatures" class="">] ?? .null {</span></div><div style="margin: 0px; line-height: normal; color: rgb(0, 143, 0);" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #000000" class="">&nbsp; &nbsp; &nbsp; </span><span style="font-variant-ligatures: no-common-ligatures" class="">// now we have the age</span></div><div style="margin: 0px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">&nbsp; &nbsp; }</span></div><div style="margin: 0px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">&nbsp; }</span></div><div style="margin: 0px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures" class="">}</span></div><div class=""><span style="font-variant-ligatures: no-common-ligatures" class=""><br class=""></span></div></div></div><div class=""><span style="font-variant-ligatures: no-common-ligatures" class="">The multiple indentation levels can rapidly make this code unattractive to read, and we need to add a null case to the enum to deal with optional values.</span></div><div class=""><span style="font-variant-ligatures: no-common-ligatures" class=""><br class=""></span></div><div style="font-size: 16px;" class=""><span style="font-variant-ligatures: no-common-ligatures" class=""><b class="">Proposed solution:</b></span></div><div class=""><span style="font-variant-ligatures: no-common-ligatures" class="">I suggest to add a new syntax, using the case keyword to ease access to the payload of such enums :</span></div><div class=""><span style="font-variant-ligatures: no-common-ligatures" class=""><br class=""></span></div><div class=""><span style="font-variant-ligatures: no-common-ligatures" class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><b class=""><span style="font-variant-ligatures: no-common-ligatures; color: #0433ff" class="">let</span><span style="font-variant-ligatures: no-common-ligatures" class=""> payloadContent = </span><span style="font-variant-ligatures: no-common-ligatures; color: #0433ff" class="">case</span><span style="font-variant-ligatures: no-common-ligatures" class="">? .enumCase(variable)</span></b></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><br class=""></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-family: Helvetica; font-size: 12px;" class="">The payloadContent variable will be an optional, that can be either nil, or contain the payload of enumCase.</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-family: Helvetica; font-size: 12px;" class="">If the payload contains multiple variables, payloadContent will be a tupple.</span></div><div style="margin: 0px; line-height: normal;" class="">This syntax can&nbsp;accommodate&nbsp;an optional variable as an input. If the value of variable is nil, then payloadContent will be nil.</div><div style="margin: 0px; line-height: normal;" class="">Only enum cases with a payload can be used with this syntax (it would make no sens for cases without a payload).</div><div style="margin: 0px; line-height: normal;" class=""><br class=""></div><div style="margin: 0px; line-height: normal;" class="">With that syntax, the null case of the enum can be removed, and the code to access the age becomes:</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><br class=""></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><div style="margin: 0px; line-height: normal;" class=""><div style="margin: 0px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #0433ff" class="">let</span><span style="font-variant-ligatures: no-common-ligatures" class=""> book = </span><span style="font-variant-ligatures: no-common-ligatures; color: #0433ff" class="">case</span><span style="font-variant-ligatures: no-common-ligatures" class="">? .dict(inputData)</span></div><div style="margin: 0px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #0433ff" class="">let</span><span style="font-variant-ligatures: no-common-ligatures" class=""> author = </span><span style="font-variant-ligatures: no-common-ligatures; color: #0433ff" class="">case</span><span style="font-variant-ligatures: no-common-ligatures" class="">? .dict(book?[</span><span style="font-variant-ligatures: no-common-ligatures; color: #b4261a" class="">"author"</span><span style="font-variant-ligatures: no-common-ligatures" class="">])</span></div><div style="margin: 0px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures; color: #0433ff" class="">let</span><span style="font-variant-ligatures: no-common-ligatures" class=""> age = </span><span style="font-variant-ligatures: no-common-ligatures; color: #0433ff" class="">case</span><span style="font-variant-ligatures: no-common-ligatures" class="">? .integer(author?[</span><span style="font-variant-ligatures: no-common-ligatures; color: #b4261a" class="">"age"</span><span style="font-variant-ligatures: no-common-ligatures" class="">])</span></div></div></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-family: Helvetica; font-size: 12px;" class=""><br class=""></span></div><div style="margin: 0px; line-height: normal; font-family: Menlo; font-size: 13px;" class=""><span style="font-family: Helvetica; font-size: 14px;" class=""><b class="">Advantages:</b></span></div><div style="margin: 0px; line-height: normal;" class=""><span style="font-family: Helvetica; font-size: 12px;" class="">- It leverages the well established notion of optional, and similar logic already exists in the language (for the as? operator notably)</span>.</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-family: Helvetica; font-size: 12px;" class="">- It does not add a new keyword</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-family: Helvetica; font-size: 12px;" class="">- It promotes the use of enum to enforce explicit typing, which leads to more self-documenting code</span></div><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-family: Helvetica; font-size: 12px;" class="">- It reduces the complexity of the code in situations such as the one of the exemple</span></div><div class=""><span style="font-family: Helvetica; font-size: 12px;" class=""><br class=""></span></div></div><div style="margin: 0px; line-height: normal; font-family: Menlo; font-size: 13px;" class=""><span style="font-family: Helvetica; font-size: 14px;" class=""><b class="">Drawbacks:</b></span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-family: Helvetica; font-size: 12px;" class="">- It adds a third use of the case keyword.&nbsp;</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-family: Helvetica; font-size: 12px;" class="">- In the proposed syntax, the variable between parenthesis is not the payload, but the variable to decode. This might be disturbing, as it differs from the other syntax of enum values.</span></div><div style="margin: 0px; line-height: normal;" class="">- If the payload is an optional, it is not possible to differentiate a non-matching case and a matching case a nil payload.</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-family: Helvetica; font-size: 12px;" class=""><br class=""></span></div><div style="margin: 0px; line-height: normal; font-family: Menlo; font-size: 13px;" class=""><span style="font-family: Helvetica; font-size: 14px;" class=""><b class="">Alternatives:</b></span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-family: Helvetica; font-size: 12px;" class="">- Another syntax without parenthesis could be used to avoid the second drawback:</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures; color: rgb(4, 51, 255);" class="">let</span><span style="font-variant-ligatures: no-common-ligatures;" class="">&nbsp;payload =&nbsp;</span><span style="font-variant-ligatures: no-common-ligatures; color: rgb(4, 51, 255);" class="">case</span><span style="font-variant-ligatures: no-common-ligatures;" class="">? .enumCase variable</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures;" class=""><br class=""></span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures;" class=""><span style="font-family: Helvetica; font-size: 12px;" class=""><b style="font-size: 14px;" class="">Impact on existing code:</b></span></span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures;" class=""><span style="font-family: Helvetica; font-size: 12px;" class="">None, this is adding a new syntax</span></span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures;" class=""><br class=""></span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><br class=""></div><div style="margin: 0px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures;" class="">This proposal would have no impact on the ABI, so it probably does not fit the stage 1 of swift 4’s roadmap. But I would be glad to have your feedback, so that I can have a proposal ready once we enter stage 2.</span></div><div style="margin: 0px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures;" class="">So what your thoughts on that proposal ?</span></div><div style="margin: 0px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures;" class=""><br class=""></span></div><div style="margin: 0px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures;" class="">Thanks</span></div><div style="margin: 0px; line-height: normal;" class=""><span style="font-variant-ligatures: no-common-ligatures;" class=""><br class=""></span></div><div style="margin: 0px; line-height: normal;" class="">Jerome</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures;" class=""><span style="font-family: Helvetica; font-size: 12px;" class=""><br class=""></span></span></div></span></div></body></html>