<div dir="ltr"><div>Mateusz,<br></div><br>To me, &quot;Enumeration defines a type with well defined set of possible values&quot; seems to contradict the idea of having properties that can have different values. What could you do with this special enum - what would the code that uses it look like?<br><br><br></div><br><div class="gmail_quote"><div dir="ltr">On Sun, 9 Oct 2016 at 04:56 Robert Widmann via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word" class="gmail_msg"><div class="gmail_msg">I’ve started doing this to try and mimic “Smart Constructors” in Haskell and I think it works quite well.</div><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg"><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo" class="gmail_msg"><span style="font-variant-ligatures:no-common-ligatures;color:#ba2da2" class="gmail_msg">struct</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg"> Format {</span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo" class="gmail_msg"><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">  </span><span style="font-variant-ligatures:no-common-ligatures;color:#ba2da2" class="gmail_msg">enum</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg"> FormatBacking {</span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo" class="gmail_msg"><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">    </span><span style="font-variant-ligatures:no-common-ligatures;color:#ba2da2" class="gmail_msg">case</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg"> SMALL(</span><span style="font-variant-ligatures:no-common-ligatures;color:#703daa" class="gmail_msg">Int</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">, </span><span style="font-variant-ligatures:no-common-ligatures;color:#703daa" class="gmail_msg">Int</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">)</span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo" class="gmail_msg"><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">    </span><span style="font-variant-ligatures:no-common-ligatures;color:#ba2da2" class="gmail_msg">case</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg"> MEDIUM(</span><span style="font-variant-ligatures:no-common-ligatures;color:#703daa" class="gmail_msg">Int</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">, </span><span style="font-variant-ligatures:no-common-ligatures;color:#703daa" class="gmail_msg">Int</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">)</span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo" class="gmail_msg"><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">    </span><span style="font-variant-ligatures:no-common-ligatures;color:#ba2da2" class="gmail_msg">case</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg"> LARGE(</span><span style="font-variant-ligatures:no-common-ligatures;color:#703daa" class="gmail_msg">Int</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">, </span><span style="font-variant-ligatures:no-common-ligatures;color:#703daa" class="gmail_msg">Int</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">)</span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo" class="gmail_msg"><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">  }</span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo" class="gmail_msg"><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">  </span><span style="font-variant-ligatures:no-common-ligatures;color:#ba2da2" class="gmail_msg">private</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg"> </span><span style="font-variant-ligatures:no-common-ligatures;color:#ba2da2" class="gmail_msg">let</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg"> unFormat : </span><span style="font-variant-ligatures:no-common-ligatures;color:#4f8187" class="gmail_msg">FormatBacking</span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;min-height:13px" class="gmail_msg"><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg"></span><br class="gmail_msg"></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo" class="gmail_msg"><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">  </span><span style="font-variant-ligatures:no-common-ligatures;color:#ba2da2" class="gmail_msg">static</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg"> </span><span style="font-variant-ligatures:no-common-ligatures;color:#ba2da2" class="gmail_msg">var</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg"> Small : </span><span style="font-variant-ligatures:no-common-ligatures;color:#4f8187" class="gmail_msg">Format</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg"> {</span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo" class="gmail_msg"><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">    </span><span style="font-variant-ligatures:no-common-ligatures;color:#ba2da2" class="gmail_msg">return</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg"> </span><span style="font-variant-ligatures:no-common-ligatures;color:#4f8187" class="gmail_msg">Format</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">(unFormat: .</span><span style="font-variant-ligatures:no-common-ligatures;color:#31595d" class="gmail_msg">SMALL</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">(</span><span style="font-variant-ligatures:no-common-ligatures;color:#272ad8" class="gmail_msg">30</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">, </span><span style="font-variant-ligatures:no-common-ligatures;color:#272ad8" class="gmail_msg">30</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">))</span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo" class="gmail_msg"><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">  }</span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;min-height:13px" class="gmail_msg"><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg"></span><br class="gmail_msg"></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo" class="gmail_msg"><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">  </span><span style="font-variant-ligatures:no-common-ligatures;color:#ba2da2" class="gmail_msg">static</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg"> </span><span style="font-variant-ligatures:no-common-ligatures;color:#ba2da2" class="gmail_msg">var</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg"> Medium : </span><span style="font-variant-ligatures:no-common-ligatures;color:#4f8187" class="gmail_msg">Format</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg"> {</span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo" class="gmail_msg"><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">    </span><span style="font-variant-ligatures:no-common-ligatures;color:#ba2da2" class="gmail_msg">return</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg"> </span><span style="font-variant-ligatures:no-common-ligatures;color:#4f8187" class="gmail_msg">Format</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">(unFormat: .</span><span style="font-variant-ligatures:no-common-ligatures;color:#31595d" class="gmail_msg">MEDIUM</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">(</span><span style="font-variant-ligatures:no-common-ligatures;color:#272ad8" class="gmail_msg">60</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">, </span><span style="font-variant-ligatures:no-common-ligatures;color:#272ad8" class="gmail_msg">60</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">))</span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo" class="gmail_msg"><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">  }</span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;min-height:13px" class="gmail_msg"><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg"></span><br class="gmail_msg"></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo" class="gmail_msg"><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">  </span><span style="font-variant-ligatures:no-common-ligatures;color:#ba2da2" class="gmail_msg">static</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg"> </span><span style="font-variant-ligatures:no-common-ligatures;color:#ba2da2" class="gmail_msg">var</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg"> Large : </span><span style="font-variant-ligatures:no-common-ligatures;color:#4f8187" class="gmail_msg">Format</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg"> {</span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo" class="gmail_msg"><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">    </span><span style="font-variant-ligatures:no-common-ligatures;color:#ba2da2" class="gmail_msg">return</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg"> </span><span style="font-variant-ligatures:no-common-ligatures;color:#4f8187" class="gmail_msg">Format</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">(unFormat: .</span><span style="font-variant-ligatures:no-common-ligatures;color:#31595d" class="gmail_msg">LARGE</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">(</span><span style="font-variant-ligatures:no-common-ligatures;color:#272ad8" class="gmail_msg">120</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">, </span><span style="font-variant-ligatures:no-common-ligatures;color:#272ad8" class="gmail_msg">120</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">))</span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo" class="gmail_msg"><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">  }</span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;min-height:13px" class="gmail_msg"><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg"></span><br class="gmail_msg"></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo" class="gmail_msg"><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">  </span><span style="font-variant-ligatures:no-common-ligatures;color:#ba2da2" class="gmail_msg">var</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg"> width : </span><span style="font-variant-ligatures:no-common-ligatures;color:#703daa" class="gmail_msg">Int</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg"> {</span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;color:rgb(186,45,162)" class="gmail_msg"><span style="font-variant-ligatures:no-common-ligatures;color:#000000" class="gmail_msg">    </span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">switch</span><span style="font-variant-ligatures:no-common-ligatures;color:#000000" class="gmail_msg"> </span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">self</span><span style="font-variant-ligatures:no-common-ligatures;color:#000000" class="gmail_msg">.</span><span style="font-variant-ligatures:no-common-ligatures;color:#4f8187" class="gmail_msg">unFormat</span><span style="font-variant-ligatures:no-common-ligatures;color:#000000" class="gmail_msg"> {</span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo" class="gmail_msg"><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">    </span><span style="font-variant-ligatures:no-common-ligatures;color:#ba2da2" class="gmail_msg">case</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg"> </span><span style="font-variant-ligatures:no-common-ligatures;color:#ba2da2" class="gmail_msg">let</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg"> .</span><span style="font-variant-ligatures:no-common-ligatures;color:#31595d" class="gmail_msg">SMALL</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">(w, </span><span style="font-variant-ligatures:no-common-ligatures;color:#ba2da2" class="gmail_msg">_</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">):</span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo" class="gmail_msg"><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">      </span><span style="font-variant-ligatures:no-common-ligatures;color:#ba2da2" class="gmail_msg">return</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg"> w</span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo" class="gmail_msg"><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">    </span><span style="font-variant-ligatures:no-common-ligatures;color:#ba2da2" class="gmail_msg">case</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg"> </span><span style="font-variant-ligatures:no-common-ligatures;color:#ba2da2" class="gmail_msg">let</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg"> .</span><span style="font-variant-ligatures:no-common-ligatures;color:#31595d" class="gmail_msg">MEDIUM</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">(w, </span><span style="font-variant-ligatures:no-common-ligatures;color:#ba2da2" class="gmail_msg">_</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">):</span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo" class="gmail_msg"><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">      </span><span style="font-variant-ligatures:no-common-ligatures;color:#ba2da2" class="gmail_msg">return</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg"> w</span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo" class="gmail_msg"><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">    </span><span style="font-variant-ligatures:no-common-ligatures;color:#ba2da2" class="gmail_msg">case</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg"> </span><span style="font-variant-ligatures:no-common-ligatures;color:#ba2da2" class="gmail_msg">let</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg"> .</span><span style="font-variant-ligatures:no-common-ligatures;color:#31595d" class="gmail_msg">LARGE</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">(w, </span><span style="font-variant-ligatures:no-common-ligatures;color:#ba2da2" class="gmail_msg">_</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">):</span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo" class="gmail_msg"><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">      </span><span style="font-variant-ligatures:no-common-ligatures;color:#ba2da2" class="gmail_msg">return</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg"> w</span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo" class="gmail_msg"><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">    }</span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo" class="gmail_msg"><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">  }</span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;min-height:13px" class="gmail_msg"><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg"></span><br class="gmail_msg"></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo" class="gmail_msg"><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">  </span><span style="font-variant-ligatures:no-common-ligatures;color:#ba2da2" class="gmail_msg">var</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg"> height : </span><span style="font-variant-ligatures:no-common-ligatures;color:#703daa" class="gmail_msg">Int</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg"> {</span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo;color:rgb(186,45,162)" class="gmail_msg"><span style="font-variant-ligatures:no-common-ligatures;color:#000000" class="gmail_msg">    </span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">switch</span><span style="font-variant-ligatures:no-common-ligatures;color:#000000" class="gmail_msg"> </span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">self</span><span style="font-variant-ligatures:no-common-ligatures;color:#000000" class="gmail_msg">.</span><span style="font-variant-ligatures:no-common-ligatures;color:#4f8187" class="gmail_msg">unFormat</span><span style="font-variant-ligatures:no-common-ligatures;color:#000000" class="gmail_msg"> {</span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo" class="gmail_msg"><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">    </span><span style="font-variant-ligatures:no-common-ligatures;color:#ba2da2" class="gmail_msg">case</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg"> </span><span style="font-variant-ligatures:no-common-ligatures;color:#ba2da2" class="gmail_msg">let</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg"> .</span><span style="font-variant-ligatures:no-common-ligatures;color:#31595d" class="gmail_msg">SMALL</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">(</span><span style="font-variant-ligatures:no-common-ligatures;color:#ba2da2" class="gmail_msg">_</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">, h):</span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo" class="gmail_msg"><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">      </span><span style="font-variant-ligatures:no-common-ligatures;color:#ba2da2" class="gmail_msg">return</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg"> h</span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo" class="gmail_msg"><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">    </span><span style="font-variant-ligatures:no-common-ligatures;color:#ba2da2" class="gmail_msg">case</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg"> </span><span style="font-variant-ligatures:no-common-ligatures;color:#ba2da2" class="gmail_msg">let</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg"> .</span><span style="font-variant-ligatures:no-common-ligatures;color:#31595d" class="gmail_msg">MEDIUM</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">(</span><span style="font-variant-ligatures:no-common-ligatures;color:#ba2da2" class="gmail_msg">_</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">, h):</span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo" class="gmail_msg"><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">      </span><span style="font-variant-ligatures:no-common-ligatures;color:#ba2da2" class="gmail_msg">return</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg"> h</span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo" class="gmail_msg"><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">    </span><span style="font-variant-ligatures:no-common-ligatures;color:#ba2da2" class="gmail_msg">case</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg"> </span><span style="font-variant-ligatures:no-common-ligatures;color:#ba2da2" class="gmail_msg">let</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg"> .</span><span style="font-variant-ligatures:no-common-ligatures;color:#31595d" class="gmail_msg">LARGE</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">(</span><span style="font-variant-ligatures:no-common-ligatures;color:#ba2da2" class="gmail_msg">_</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">, h):</span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo" class="gmail_msg"><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">      </span><span style="font-variant-ligatures:no-common-ligatures;color:#ba2da2" class="gmail_msg">return</span><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg"> h</span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo" class="gmail_msg"><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">    }</span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo" class="gmail_msg"><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">  }</span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo" class="gmail_msg"><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">}</span></div></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo" class="gmail_msg"><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg"><br class="gmail_msg"></span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo" class="gmail_msg"><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">Yeah, you’re still subject the switching stuff you mentioned before, but I don’t think this is a whole lot of code.  Java’s constants are convenient but they are an oddly structural feature in a particularly nominal language which makes it not scale particularly cleanly.</span></div></div><div style="word-wrap:break-word" class="gmail_msg"><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo" class="gmail_msg"><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg"><br class="gmail_msg"></span></div><div style="margin:0px;font-size:11px;line-height:normal;font-family:Menlo" class="gmail_msg"><span style="font-variant-ligatures:no-common-ligatures" class="gmail_msg">~Robert Widmann</span></div></div><div style="word-wrap:break-word" class="gmail_msg"><br class="gmail_msg"><div class="gmail_msg"><blockquote type="cite" class="gmail_msg"><div class="gmail_msg">On Oct 8, 2016, at 6:50 PM, Mateusz Malczak via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="gmail_msg" target="_blank">swift-evolution@swift.org</a>&gt; wrote:</div><br class="m_1193469116357271023Apple-interchange-newline gmail_msg"><div class="gmail_msg"><div class="gmail_msg">I agree, you can achieve similar result using structs (as shown in my<br class="gmail_msg">example 2). But it feels more natural to define it using an<br class="gmail_msg">enumeration type. Enumeration defines a type with well defined set of<br class="gmail_msg">possible values. Sometimes where are additional informations liked<br class="gmail_msg">with enumeration cases (like in example). Using structs for this is<br class="gmail_msg">more like a walk-around because you are using an open type to mimic a<br class="gmail_msg">closed set of possible value. What do you think about that?<br class="gmail_msg"><br class="gmail_msg">2016-10-09 0:29 GMT+02:00 Tim Vermeulen &lt;<a href="mailto:tvermeulen@me.com" class="gmail_msg" target="_blank">tvermeulen@me.com</a>&gt;:<br class="gmail_msg"><blockquote type="cite" class="gmail_msg">This is precisely what a struct is for, why would you want to be able to do this with enums instead?<br class="gmail_msg"><br class="gmail_msg"><blockquote type="cite" class="gmail_msg">Hi all,<br class="gmail_msg">I would like to know you opinion on one feature I feel would be a real &#39;nice to have&#39; extension to currently available enumeration type. Which is an enumeration type with stored properties. It is sometimes useful to store some extra informations along with enumeration cases. Idea here is to add possibility to define an enumeration type with stored, immutable, properties, defined at compile time for all cases. In opposition to currently available associated values, stored properties should be constant values stored as a part of enumeration case. Proposed feature would be treated as a new feature along the associated values and raw values.<br class="gmail_msg"><br class="gmail_msg">Please take a look at an example to illustrate this:<br class="gmail_msg">```swift<br class="gmail_msg">enum Format {<br class="gmail_msg">case SMALL(30, 30)<br class="gmail_msg">case MEDIUM(60, 60)<br class="gmail_msg">case LARGE(120, 120)<br class="gmail_msg">var width: Double<br class="gmail_msg">var height: Double<br class="gmail_msg">init(width: Double, height: Double) {<br class="gmail_msg">self.width = width<br class="gmail_msg">self.height = height<br class="gmail_msg">}<br class="gmail_msg">}<br class="gmail_msg">```<br class="gmail_msg"><br class="gmail_msg">Similar feature is currently available for example in Java (<a href="http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html" class="gmail_msg" target="_blank">http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html</a>).<br class="gmail_msg"><br class="gmail_msg">Currently there are at least tree ways to solve this limitation.<br class="gmail_msg"><br class="gmail_msg">1. use enumeration type with custom struct as a rawValue cons:<br class="gmail_msg">a lot of additional code to define structs and implement `ExpressibleByStringLiteral`<br class="gmail_msg">not really possible for more complex types, where a complex string parser would be required<br class="gmail_msg"><br class="gmail_msg">example:<br class="gmail_msg">```swift<br class="gmail_msg">struct FormatStruct: ExpressibleByStringLiteral, Equatable {<br class="gmail_msg">var width: Int = 0<br class="gmail_msg">var height: Int = 0<br class="gmail_msg">public init(width: Int, height: Int) {<br class="gmail_msg">self.width = width<br class="gmail_msg">self.height = height<br class="gmail_msg">}<br class="gmail_msg">public init(stringLiteral value: String) {<br class="gmail_msg">let set = CharacterSet(charactersIn: &quot;x&quot;)<br class="gmail_msg">let values = value.components(separatedBy: set)<br class="gmail_msg">if let width = Int(values[0]), let height = Int(values[1]) {<br class="gmail_msg">self.init(width: width, height: height)<br class="gmail_msg">} else {<br class="gmail_msg">self.init(width: 0, height: 0)<br class="gmail_msg">}<br class="gmail_msg">}<br class="gmail_msg">init(extendedGraphemeClusterLiteral value: String){<br class="gmail_msg">self.init(stringLiteral: value)<br class="gmail_msg">}<br class="gmail_msg">init(unicodeScalarLiteral value: String) {<br class="gmail_msg">self.init(stringLiteral: value)<br class="gmail_msg">}<br class="gmail_msg">static func ==(lhs: FormatStruct, rhs: FormatStruct) -&gt;Bool {<br class="gmail_msg">return (lhs.width == rhs.width)&amp;&amp;(lhs.height == rhs.height)<br class="gmail_msg">}<br class="gmail_msg">static let A = FormatStruct(width: 30, height: 30)<br class="gmail_msg">}<br class="gmail_msg">enum Format: FormatStruct {<br class="gmail_msg">case SMALL = &quot;30x30&quot;<br class="gmail_msg">case MEDIUM = &quot;60x60&quot;<br class="gmail_msg">case LARGE = &quot;120x120&quot;<br class="gmail_msg">var width: Int {<br class="gmail_msg">return rawValue.width<br class="gmail_msg">}<br class="gmail_msg">var height: Int {<br class="gmail_msg">return rawValue.height<br class="gmail_msg">}<br class="gmail_msg">}<br class="gmail_msg">```<br class="gmail_msg"><br class="gmail_msg">2. static struct values to mimic enumeration type<br class="gmail_msg">cons:<br class="gmail_msg">enum should be used to define a closed set of possible values<br class="gmail_msg"><br class="gmail_msg">example:<br class="gmail_msg">```swift<br class="gmail_msg">struct Format: ExpressibleByStringLiteral, Equatable {<br class="gmail_msg">var width: Int = 0<br class="gmail_msg">var height: Int = 0<br class="gmail_msg">public init(width: Int, height: Int) {<br class="gmail_msg">self.width = width<br class="gmail_msg">self.height = height<br class="gmail_msg">}<br class="gmail_msg">static let SMALL = FormatStruct(width: 30, height: 30)<br class="gmail_msg">static let MEDIUM = FormatStruct(width: 60, height: 60)<br class="gmail_msg">static let LARGE = FormatStruct(width: 120, height: 120)<br class="gmail_msg">}<br class="gmail_msg">```<br class="gmail_msg"><br class="gmail_msg">3. define enum with getters<br class="gmail_msg">cons:<br class="gmail_msg">additional, repeated `switch` clauses in getters<br class="gmail_msg"><br class="gmail_msg">example:<br class="gmail_msg">```swift<br class="gmail_msg">enum Format2 { case SMALL case MEDIUM case LARGE var width: Int { switch self { case .SMALL: return 30 case .MEDIUM: return 60 case .LARGE: return 120 } } var height: Int { switch self { case .SMALL: return 30 case .MEDIUM: return 60 case .LARGE: return 120 } } }<br class="gmail_msg">```<br class="gmail_msg"><br class="gmail_msg">What is your opinion on this feature? Or maybe that was not implemented for some reason - if so can I get an few word of explaination what was the motivation for not adding this to the language?<br class="gmail_msg"><br class="gmail_msg">best regards<br class="gmail_msg">--<br class="gmail_msg">| Mateusz Malczak_______________________________________________<br class="gmail_msg">swift-evolution mailing list<br class="gmail_msg"><a href="mailto:swift-evolution@swift.org" class="gmail_msg" target="_blank">swift-evolution@swift.org</a><br class="gmail_msg"><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" class="gmail_msg" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br class="gmail_msg"><br class="gmail_msg"><br class="gmail_msg"><br class="gmail_msg"></blockquote></blockquote>_______________________________________________<br class="gmail_msg">swift-evolution mailing list<br class="gmail_msg"><a href="mailto:swift-evolution@swift.org" class="gmail_msg" target="_blank">swift-evolution@swift.org</a><br class="gmail_msg"><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" class="gmail_msg" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br class="gmail_msg"></div></div></blockquote></div><br class="gmail_msg"></div>_______________________________________________<br class="gmail_msg">
swift-evolution mailing list<br class="gmail_msg">
<a href="mailto:swift-evolution@swift.org" class="gmail_msg" target="_blank">swift-evolution@swift.org</a><br class="gmail_msg">
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" class="gmail_msg" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br class="gmail_msg">
</blockquote></div>