<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body dir="auto"><div></div><div><br></div><div><br>On Apr 24, 2017, at 2:09 PM, Kevin Nattinger &lt;<a href="mailto:swift@nattinger.net">swift@nattinger.net</a>&gt; wrote:<br><br></div><blockquote type="cite"><div><meta http-equiv="Content-Type" content="text/html charset=utf-8"><br class=""><div><blockquote type="cite" class=""><div class="">On Apr 24, 2017, at 1:36 PM, Jaden Geller &lt;<a href="mailto:jaden.geller@gmail.com" class="">jaden.geller@gmail.com</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><blockquote type="cite" class="" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><div class=""><br class="Apple-interchange-newline">On Apr 24, 2017, at 1:15 PM, Kevin Nattinger via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><div class="" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;">This makes it more convenient to create them, sure, but how would you pass them around or extract the value&nbsp;in a type-safe manner?</div></div></blockquote><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br class=""></div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">If the case introduces a generic type, than the switching over that case introduces a generic type variable in that scope.</div></div></blockquote><div><br class=""></div><div>I don’t want a generic type, I want to be able to specify exactly what types the function accepts.&nbsp;</div></div></div></blockquote><div><br></div><div>Generic cases are exactly what I understand to be proposed. Can you explain how what you're looking for differs?</div><br><blockquote type="cite"><div><div><br class=""><blockquote type="cite" class=""><div class=""><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br class=""></div><blockquote type="cite" class="" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><div class=""><div class="" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><div class=""><br class=""></div><div class="">e.g. now I can write:</div><div class=""><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;"><span class="" style="font-variant-ligatures: no-common-ligatures; color: rgb(186, 45, 162);">enum</span><span class="" style="font-variant-ligatures: no-common-ligatures;"><span class="Apple-converted-space">&nbsp;</span>Thing&lt;T, U&gt; {</span></div><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;"><span class="" style="font-variant-ligatures: no-common-ligatures;">&nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span></span><span class="" style="font-variant-ligatures: no-common-ligatures; color: rgb(186, 45, 162);">case</span><span class="" style="font-variant-ligatures: no-common-ligatures;"><span class="Apple-converted-space">&nbsp;</span>thingOne(</span><span class="" style="font-variant-ligatures: no-common-ligatures; color: rgb(79, 129, 135);">T</span><span class="" style="font-variant-ligatures: no-common-ligatures;">)</span></div><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;"><span class="" style="font-variant-ligatures: no-common-ligatures;">&nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span></span><span class="" style="font-variant-ligatures: no-common-ligatures; color: rgb(186, 45, 162);">case</span><span class="" style="font-variant-ligatures: no-common-ligatures;"><span class="Apple-converted-space">&nbsp;</span>thingTwo(</span><span class="" style="font-variant-ligatures: no-common-ligatures; color: rgb(79, 129, 135);">U</span><span class="" style="font-variant-ligatures: no-common-ligatures;">)</span></div><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;"><span class="" style="font-variant-ligatures: no-common-ligatures;">}</span></div><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; min-height: 13px;"><span class="" style="font-variant-ligatures: no-common-ligatures;"></span><br class=""></div><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; min-height: 13px;"><div class="" style="margin: 0px; line-height: normal; color: rgb(0, 132, 0);"><span class="" style="font-variant-ligatures: no-common-ligatures;">// How do I require thingOne&lt;String&gt; or thingTwo&lt;Int&gt;?</span></div></div><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;"><span class="" style="font-variant-ligatures: no-common-ligatures; color: rgb(186, 45, 162);">func</span><span class="" style="font-variant-ligatures: no-common-ligatures;"><span class="Apple-converted-space">&nbsp;</span>handle(thing:<span class="Apple-converted-space">&nbsp;</span></span><span class="" style="font-variant-ligatures: no-common-ligatures; color: rgb(79, 129, 135);">Thing</span><span class="" style="font-variant-ligatures: no-common-ligatures;">&lt;</span><span class="" style="font-variant-ligatures: no-common-ligatures; color: rgb(112, 61, 170);">String</span><span class="" style="font-variant-ligatures: no-common-ligatures;">,<span class="Apple-converted-space">&nbsp;</span></span><span class="" style="font-variant-ligatures: no-common-ligatures; color: rgb(112, 61, 170);">Int</span><span class="" style="font-variant-ligatures: no-common-ligatures;">&gt;) {</span></div><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;"><span class="" style="font-variant-ligatures: no-common-ligatures;">&nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span></span><span class="" style="font-variant-ligatures: no-common-ligatures; color: rgb(186, 45, 162);">switch</span><span class="" style="font-variant-ligatures: no-common-ligatures;"><span class="Apple-converted-space">&nbsp;</span>thing {</span></div><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;"><span class="" style="font-variant-ligatures: no-common-ligatures;">&nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span></span><span class="" style="font-variant-ligatures: no-common-ligatures; color: rgb(186, 45, 162);">case</span><span class="" style="font-variant-ligatures: no-common-ligatures;"><span class="Apple-converted-space">&nbsp;</span>.</span><span class="" style="font-variant-ligatures: no-common-ligatures; color: rgb(49, 89, 93);">thingOne</span><span class="" style="font-variant-ligatures: no-common-ligatures;">(let s):<span class="Apple-converted-space">&nbsp;</span></span><span class="" style="font-variant-ligatures: no-common-ligatures; color: rgb(62, 30, 129);">print</span><span class="" style="font-variant-ligatures: no-common-ligatures;">(</span><span class="" style="font-variant-ligatures: no-common-ligatures; color: rgb(209, 47, 27);">"string<span class="Apple-converted-space">&nbsp;</span></span><span class="" style="font-variant-ligatures: no-common-ligatures;">\</span><span class="" style="font-variant-ligatures: no-common-ligatures; color: rgb(209, 47, 27);">(</span><span class="" style="font-variant-ligatures: no-common-ligatures;">s</span><span class="" style="font-variant-ligatures: no-common-ligatures; color: rgb(209, 47, 27);">)"</span><span class="" style="font-variant-ligatures: no-common-ligatures;">)</span></div><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;"><span class="" style="font-variant-ligatures: no-common-ligatures;">&nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span></span><span class="" style="font-variant-ligatures: no-common-ligatures; color: rgb(186, 45, 162);">case</span><span class="" style="font-variant-ligatures: no-common-ligatures;"><span class="Apple-converted-space">&nbsp;</span>.</span><span class="" style="font-variant-ligatures: no-common-ligatures; color: rgb(49, 89, 93);">thingTwo</span><span class="" style="font-variant-ligatures: no-common-ligatures;">(let i):<span class="Apple-converted-space">&nbsp;</span></span><span class="" style="font-variant-ligatures: no-common-ligatures; color: rgb(62, 30, 129);">print</span><span class="" style="font-variant-ligatures: no-common-ligatures;">(</span><span class="" style="font-variant-ligatures: no-common-ligatures; color: rgb(209, 47, 27);">"int<span class="Apple-converted-space">&nbsp;</span></span><span class="" style="font-variant-ligatures: no-common-ligatures;">\</span><span class="" style="font-variant-ligatures: no-common-ligatures; color: rgb(209, 47, 27);">(</span><span class="" style="font-variant-ligatures: no-common-ligatures;">i</span><span class="" style="font-variant-ligatures: no-common-ligatures; color: rgb(209, 47, 27);">)"</span><span class="" style="font-variant-ligatures: no-common-ligatures;">)</span></div><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;"><span class="" style="font-variant-ligatures: no-common-ligatures;">&nbsp; &nbsp; }</span></div><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;"><span class="" style="font-variant-ligatures: no-common-ligatures;">}</span></div><div class=""><span class="" style="font-variant-ligatures: no-common-ligatures;"><br class=""></span></div><div class="">With your proposed syntax:</div><div class=""><br class=""></div><div class=""><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;"><div class="" style="margin: 0px; line-height: normal;"><span class="" style="font-variant-ligatures: no-common-ligatures; color: rgb(186, 45, 162);">enum</span><span class="" style="font-variant-ligatures: no-common-ligatures;"><span class="Apple-converted-space">&nbsp;</span>Thing {</span></div><div class="" style="margin: 0px; line-height: normal;"><span class="" style="font-variant-ligatures: no-common-ligatures;">&nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span></span><span class="" style="font-variant-ligatures: no-common-ligatures; color: rgb(186, 45, 162);">case</span><span class="" style="font-variant-ligatures: no-common-ligatures;"><span class="Apple-converted-space">&nbsp;</span>thingOne&lt;T&gt;(T)</span></div><div class="" style="margin: 0px; line-height: normal;"><span class="" style="font-variant-ligatures: no-common-ligatures;">&nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span></span><span class="" style="font-variant-ligatures: no-common-ligatures; color: rgb(186, 45, 162);">case</span><span class="" style="font-variant-ligatures: no-common-ligatures;"><span class="Apple-converted-space">&nbsp;</span>thingTwo&lt;T&gt;(T)</span></div><div class="" style="margin: 0px; line-height: normal;"><span class="" style="font-variant-ligatures: no-common-ligatures;">}</span></div><div class="" style="margin: 0px; line-height: normal; min-height: 13px;"><br class=""><span class="" style="font-variant-ligatures: no-common-ligatures;"></span></div><div class="" style="margin: 0px; line-height: normal;"><span class="" style="font-variant-ligatures: no-common-ligatures; color: rgb(186, 45, 162);">func</span><span class="" style="font-variant-ligatures: no-common-ligatures;"><span class="Apple-converted-space">&nbsp;</span>handle(thing:<span class="Apple-converted-space">&nbsp;</span></span><span class="" style="font-variant-ligatures: no-common-ligatures; color: rgb(112, 61, 170);">Thing</span><span class="" style="font-variant-ligatures: no-common-ligatures;">) {</span></div><div class="" style="margin: 0px; line-height: normal;"><span class="" style="font-variant-ligatures: no-common-ligatures;">&nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span></span><span class="" style="font-variant-ligatures: no-common-ligatures; color: rgb(186, 45, 162);">switch</span><span class="" style="font-variant-ligatures: no-common-ligatures;"><span class="Apple-converted-space">&nbsp;</span>thing {</span></div><div class="" style="margin: 0px; line-height: normal;"><span class="" style="font-variant-ligatures: no-common-ligatures;">&nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span></span><span class="" style="font-variant-ligatures: no-common-ligatures; color: rgb(186, 45, 162);">case</span><span class="" style="font-variant-ligatures: no-common-ligatures;"><span class="Apple-converted-space">&nbsp;</span>thingOne(let s):</span></div></div></div></div></div></div></blockquote><blockquote type="cite" class="" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><div class=""><div class="" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><div class=""><div class=""><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;"><div class="" style="margin: 0px; line-height: normal; color: rgb(0, 132, 0);"><span class="" style="font-variant-ligatures: no-common-ligatures;">&nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span></span><span class="" style="font-variant-ligatures: no-common-ligatures;">// What is the type of s?</span></div></div></div></div></div></div></blockquote><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br class=""></div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">It is some new generic variable `T`. It might be best to require that it is explicitly introduced:</div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">```</div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><div class="" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><div class=""><div class=""><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;"><div class="" style="margin: 0px; line-height: normal;"><span class="" style="font-variant-ligatures: no-common-ligatures; color: rgb(186, 45, 162);">&nbsp; &nbsp; case</span><span class="" style="font-variant-ligatures: no-common-ligatures;">&nbsp;thingOne&lt;T&gt;(let s):</span></div></div></div></div></div></div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">```</div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">You could use `s` like you could use `x` in `func &lt;T&gt;(x: T) { … }`. That’s to say that you couldn’t do much with it. You could store it in an `Any`. You could dynamically check the type. You could ignore it. You could print it.</div></div></blockquote><div><br class=""></div><div>So what good is a value I can’t do anything with?</div></div></div></blockquote><div><br></div><div>It's not particularly useful BECAUSE you didn't specify any generic constraints. Just like a generic function, you can only do with a value what it's constraints allow.</div><br><blockquote type="cite"><div><div><br class=""><blockquote type="cite" class=""><div class=""><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br class=""></div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">It becomes a lot more useful when there are constraints on `T` in the original case definition of the type. For example, if `case thingOne&lt;T: FloatingPoint&gt;(T)` were written in the original enum definition, you could do anything with `s` that you could do with a `FloatingPoint`.</div><br class="" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><blockquote type="cite" class="" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><div class=""><div class="" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><div class=""><div class=""><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;"><div class="" style="margin: 0px; line-height: normal;"><span class="" style="font-variant-ligatures: no-common-ligatures;">&nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span></span><span class="" style="font-variant-ligatures: no-common-ligatures; color: rgb(186, 45, 162);">case</span><span class="" style="font-variant-ligatures: no-common-ligatures;"><span class="Apple-converted-space">&nbsp;</span>thingTwo&lt;</span><span class="" style="font-variant-ligatures: no-common-ligatures; color: rgb(112, 61, 170);">Int&gt;</span><span class="" style="font-variant-ligatures: no-common-ligatures;">(let i):</span></div><div class="" style="margin: 0px; line-height: normal; color: rgb(0, 132, 0);"><span class="" style="font-variant-ligatures: no-common-ligatures;">&nbsp; &nbsp; &nbsp; &nbsp;<span class="Apple-converted-space">&nbsp;</span></span><span class="" style="font-variant-ligatures: no-common-ligatures;">// is it even possible to write an exhaustive switch?</span></div></div></div></div></div></div></blockquote><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br class=""></div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">Sure, but this switch isn’t yet exhaustive. You’d also have to add another case:</div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">```</div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><div class=""><div class="" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><div class=""><div class=""><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;"><div class="" style="margin: 0px; line-height: normal;"><span class="" style="font-variant-ligatures: no-common-ligatures; color: rgb(186, 45, 162);">&nbsp; &nbsp; case</span><span class="" style="font-variant-ligatures: no-common-ligatures;">&nbsp;thingTwo&lt;T&gt;(let i):</span></div></div></div></div></div></div></div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">```</div></div></blockquote><div><br class=""></div><div>In my original code, the function specifies exactly what it can handle, and that restriction is enforced by the compiler. Do </div></div></div></blockquote><div><br></div><div>Your switch statement wasn't exhaustive. You need to add an additional case that handles a T that isn't an Int (because it might not be one)! Swift cannot statically know the payload since it isn't part of the type. The case generics are erased, and you need to use case matching to bring them back.</div><br><blockquote type="cite"><div><div><div>you really think it would be an improvement to remove compile-time type restrictions? We may as well get rid of the type system and duck-type like python. At least that would speed up type-inference bottlenecks.</div></div></div></blockquote><div><br></div><div>That's entirely not what I advocated. I don't appreciate you strawmanning my explanation.</div><div><br></div><div>The model I explained is consistent with Swift's current type checking. It certainly does not remove any restrictions or add duck typing.</div><div><br></div><div>How can I improve your understanding?</div><br><blockquote type="cite"><div><div><br class=""><blockquote type="cite" class=""><div class=""><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">When we do come back to this proposal, it might be reasonable to leave these sorts of specializations (e.g. `case thingTwo&lt;Int&gt;`) out of the initial design since they might significantly complicate the model and they are entirely additive. I’m not sure though, I’m not familiar with the implementation.</div><br class="" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><blockquote type="cite" class="" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><div class=""><div class="" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><div class=""><div class=""><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;"><div class="" style="margin: 0px; line-height: normal;"><span class="" style="font-variant-ligatures: no-common-ligatures;">&nbsp; &nbsp; }</span></div><div class="" style="margin: 0px; line-height: normal;"><span class="" style="font-variant-ligatures: no-common-ligatures;">}</span></div></div></div><div class=""><br class=""></div></div></div></div></blockquote><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br class=""></div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">I’d really love to see GADTs in Swift, even if in a more limited form! Another GADT feature that would be nice to add (though probably would deserve a separate, later proposal) would be specialized generic return types for each case:</div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br class=""></div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">```</div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><div class="" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><div class=""><div class=""><div class="" style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;"><div class="" style="margin: 0px; line-height: normal;"><span class="" style="font-variant-ligatures: no-common-ligatures; color: rgb(186, 45, 162);">enum</span><span class="" style="font-variant-ligatures: no-common-ligatures;">&nbsp;Expr&lt;T&gt; {</span></div><div class="" style="margin: 0px; line-height: normal;"><span class="" style="font-variant-ligatures: no-common-ligatures;">&nbsp; &nbsp;&nbsp;</span><span class="" style="font-variant-ligatures: no-common-ligatures; color: rgb(186, 45, 162);">case</span><span class="" style="font-variant-ligatures: no-common-ligatures;">&nbsp;value(T) -&gt; Expr&lt;T&gt;</span></div><div class="" style="margin: 0px; line-height: normal;"><span class="" style="font-variant-ligatures: no-common-ligatures;">&nbsp; &nbsp;&nbsp;</span><span class="" style="font-variant-ligatures: no-common-ligatures; color: rgb(186, 45, 162);">case</span><span class="" style="font-variant-ligatures: no-common-ligatures;">&nbsp;plus(Expr&lt;Int&gt;, Expr&lt;Int&gt;) -&gt; Expr&lt;Int&gt;</span></div><div class="" style="margin: 0px; line-height: normal;"><span class="" style="font-variant-ligatures: no-common-ligatures;">&nbsp; &nbsp;&nbsp;</span><span class="" style="font-variant-ligatures: no-common-ligatures; color: rgb(186, 45, 162);">case</span><span class="" style="font-variant-ligatures: no-common-ligatures;">&nbsp;and(Expr&lt;Bool&gt;, Expr&lt;Bool&gt;) -&gt; Expr&lt;Bool&gt;</span></div><div class="" style="margin: 0px; line-height: normal;"><span class="" style="font-variant-ligatures: no-common-ligatures;">&nbsp; &nbsp;&nbsp;</span><span class="" style="font-variant-ligatures: no-common-ligatures; color: rgb(186, 45, 162);">case</span><span class="" style="font-variant-ligatures: no-common-ligatures;">&nbsp;equals(Expr&lt;T&gt;, Expr&lt;T&gt;) -&gt; Expr&lt;T&gt;&nbsp;<span class="" style="color: rgb(186, 45, 162);">where</span>&nbsp;T: Equatable</span></div><div class="" style="margin: 0px; line-height: normal;">}</div></div></div></div></div></div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">```</div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br class=""></div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">But ya, I realize this is a very major complication of the model… Would be so cool though!</div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br class=""></div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">This is all definitely out of scope for Swift 4, and likely out of scope for Swift 5 even… I guess we’ll find out once we get there. Still fun to think about!</div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br class=""></div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">Cheers,</div><div style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">Jaden Geller</div><br class="" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><blockquote type="cite" class="" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"><div class=""><div class="" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><div class=""><div class=""><span class="" style="font-variant-ligatures: no-common-ligatures;"><br class=""></span></div><div class=""><br class=""><div class=""><blockquote type="cite" class=""><div class="">On Apr 24, 2017, at 6:57 AM, Joshua Alvarado via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class=""><div class=""><h1 class="" style="box-sizing: border-box; margin: 0px 0px 16px; line-height: 1.25; padding-bottom: 0.3em; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(234, 236, 239); color: rgb(36, 41, 46);"><font face="arial, helvetica, sans-serif" size="2" class=""><span class="" style="font-weight: normal;">Here is my pitch on adding generics to enum cases and not to the enum type itself. Let me know if you have an improvements or modifications lets open it to discussion thank you swiftys! :)</span></font></h1><h1 class="" style="box-sizing: border-box; margin: 0px 0px 16px; line-height: 1.25; padding-bottom: 0.3em; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(234, 236, 239); color: rgb(36, 41, 46); font-family: -apple-system, blinkmacsystemfont, 'segoe ui', helvetica, arial, sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol';">Enum with generic cases</h1><ul class="" style="box-sizing: border-box; padding-left: 2em; margin-top: 0px; margin-bottom: 16px; color: rgb(36, 41, 46); font-family: -apple-system, blinkmacsystemfont, 'segoe ui', helvetica, arial, sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol'; font-size: 16px;"><li class="" style="box-sizing: border-box;">Proposal:&nbsp;<a href="https://github.com/lostatseajoshua/swift-evolution/blob/master/NNNN-enum-generic-cases.md" class="" style="box-sizing: border-box; background-color: transparent; color: rgb(3, 102, 214); text-decoration: none;">SE-NNNN</a></li><li class="" style="box-sizing: border-box; margin-top: 0.25em;">Authors:&nbsp;<a href="https://github.com/alvaradojoshua0" class="" style="box-sizing: border-box; background-color: transparent; color: rgb(3, 102, 214); text-decoration: none;">Joshua Alvarado</a></li><li class="" style="box-sizing: border-box; margin-top: 0.25em;">Review Manager: TBD</li><li class="" style="box-sizing: border-box; margin-top: 0.25em;">Status:&nbsp;<span class="" style="box-sizing: border-box; font-weight: 600;">PITCH</span></li></ul><p class="" style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(36, 41, 46); font-family: -apple-system, blinkmacsystemfont, 'segoe ui', helvetica, arial, sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol'; font-size: 16px;"><em class="" style="box-sizing: border-box;">During the review process, add the following fields as needed:</em></p><ul class="" style="box-sizing: border-box; padding-left: 2em; margin-top: 0px; margin-bottom: 16px; color: rgb(36, 41, 46); font-family: -apple-system, blinkmacsystemfont, 'segoe ui', helvetica, arial, sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol'; font-size: 16px;"><li class="" style="box-sizing: border-box;">Decision Notes:&nbsp;<a href="https://lists.swift.org/pipermail/swift-evolution/" class="" style="box-sizing: border-box; background-color: transparent; color: rgb(3, 102, 214); text-decoration: none;">Rationale</a>,&nbsp;<a href="https://lists.swift.org/pipermail/swift-evolution/" class="" style="box-sizing: border-box; background-color: transparent; color: rgb(3, 102, 214); text-decoration: none;">Additional Commentary</a></li><li class="" style="box-sizing: border-box; margin-top: 0.25em;">Bugs:&nbsp;<a href="https://bugs.swift.org/browse/SR-NNNN" class="" style="box-sizing: border-box; background-color: transparent; color: rgb(3, 102, 214); text-decoration: none;">SR-NNNN</a>,&nbsp;<a href="https://bugs.swift.org/browse/SR-MMMM" class="" style="box-sizing: border-box; background-color: transparent; color: rgb(3, 102, 214); text-decoration: none;">SR-MMMM</a></li><li class="" style="box-sizing: border-box; margin-top: 0.25em;">Previous Revision:&nbsp;<a href="https://github.com/apple/swift-evolution/blob/...commit-ID.../proposals/NNNN-filename.md" class="" style="box-sizing: border-box; background-color: transparent; color: rgb(3, 102, 214); text-decoration: none;">1</a></li><li class="" style="box-sizing: border-box; margin-top: 0.25em;">Previous Proposal:&nbsp;<a href="https://github.com/lostatseajoshua/swift-evolution/blob/master/XXXX-filename.md" class="" style="box-sizing: border-box; background-color: transparent; color: rgb(3, 102, 214); text-decoration: none;">SE-XXXX</a></li></ul><h2 class="" style="box-sizing: border-box; margin-top: 24px; margin-bottom: 16px; line-height: 1.25; padding-bottom: 0.3em; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(234, 236, 239); color: rgb(36, 41, 46); font-family: -apple-system, blinkmacsystemfont, 'segoe ui', helvetica, arial, sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol';"><a id="gmail-user-content-introduction" class="gmail-anchor" href="https://github.com/lostatseajoshua/swift-evolution/tree/master#introduction" style="box-sizing: border-box; background-color: transparent; color: rgb(3, 102, 214); text-decoration: none; float: left; padding-right: 4px; line-height: 1;"></a>Introduction</h2><p class="" style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(36, 41, 46); font-family: -apple-system, blinkmacsystemfont, 'segoe ui', helvetica, arial, sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol'; font-size: 16px;">This proposal adds a change to the enumeration type that allows an enum case to cast a generic on its associated value.</p><p class="" style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(36, 41, 46); font-family: -apple-system, blinkmacsystemfont, 'segoe ui', helvetica, arial, sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol'; font-size: 16px;">Swift-evolution thread:&nbsp;<a href="https://lists.swift.org/pipermail/swift-evolution/" class="" style="box-sizing: border-box; background-color: transparent; color: rgb(3, 102, 214); text-decoration: none;">Discussion thread topic for that proposal</a></p><h2 class="" style="box-sizing: border-box; margin-top: 24px; margin-bottom: 16px; line-height: 1.25; padding-bottom: 0.3em; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(234, 236, 239); color: rgb(36, 41, 46); font-family: -apple-system, blinkmacsystemfont, 'segoe ui', helvetica, arial, sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol';"><a id="gmail-user-content-motivation" class="gmail-anchor" href="https://github.com/lostatseajoshua/swift-evolution/tree/master#motivation" style="box-sizing: border-box; background-color: transparent; color: rgb(3, 102, 214); text-decoration: none; float: left; padding-right: 4px; line-height: 1;"></a>Motivation</h2><p class="" style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(36, 41, 46); font-family: -apple-system, blinkmacsystemfont, 'segoe ui', helvetica, arial, sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol'; font-size: 16px;">Enums currently support generics, but they are added onto the type itself. This can cause adverse syntax when implementing generics for associated values to be stored along each case. The enum case holds the associated value (not the enum type itself) so should create its own value constraints.</p><h2 class="" style="box-sizing: border-box; margin-top: 24px; margin-bottom: 16px; line-height: 1.25; padding-bottom: 0.3em; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(234, 236, 239); color: rgb(36, 41, 46); font-family: -apple-system, blinkmacsystemfont, 'segoe ui', helvetica, arial, sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol';"><a id="gmail-user-content-proposed-solution" class="gmail-anchor" href="https://github.com/lostatseajoshua/swift-evolution/tree/master#proposed-solution" style="box-sizing: border-box; background-color: transparent; color: rgb(3, 102, 214); text-decoration: none; float: left; padding-right: 4px; line-height: 1;"></a>Proposed solution</h2><p class="" style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(36, 41, 46); font-family: -apple-system, blinkmacsystemfont, 'segoe ui', helvetica, arial, sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol'; font-size: 16px;">The generic is to be casted on the case of the enum and not on the enum itself.</p><h2 class="" style="box-sizing: border-box; margin-top: 24px; margin-bottom: 16px; line-height: 1.25; padding-bottom: 0.3em; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(234, 236, 239); color: rgb(36, 41, 46); font-family: -apple-system, blinkmacsystemfont, 'segoe ui', helvetica, arial, sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol';"><a id="gmail-user-content-detailed-design" class="gmail-anchor" href="https://github.com/lostatseajoshua/swift-evolution/tree/master#detailed-design" style="box-sizing: border-box; background-color: transparent; color: rgb(3, 102, 214); text-decoration: none; float: left; padding-right: 4px; line-height: 1;"></a>Detailed design</h2><p class="" style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(36, 41, 46); font-family: -apple-system, blinkmacsystemfont, 'segoe ui', helvetica, arial, sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol'; font-size: 16px;">Current implementation:</p><div class="gmail-highlight gmail-highlight-source-swift" style="box-sizing: border-box; margin-bottom: 16px; color: rgb(36, 41, 46); font-family: -apple-system, blinkmacsystemfont, 'segoe ui', helvetica, arial, sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol'; font-size: 16px;"><pre class="" style="box-sizing: border-box; font-family: sfmono-regular, consolas, 'liberation mono', menlo, courier, monospace; font-size: 13.600000381469727px; margin-top: 0px; margin-bottom: 0px; line-height: 1.45; word-wrap: normal; padding: 16px; overflow: auto; background-color: rgb(246, 248, 250); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-break: normal;"><span class="gmail-pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);"><span class="gmail-pl-c" style="box-sizing: border-box;">//</span> enum with two generic types</span>
<span class="gmail-pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);"></span><span class="gmail-pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">enum</span> <span class="gmail-pl-en" style="box-sizing: border-box; color: rgb(121, 93, 163);">Foo</span>&lt;<span class="gmail-pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">T</span>: <span class="gmail-pl-e" style="box-sizing: border-box; color: rgb(121, 93, 163);"><span class="gmail-pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">Hashable</span></span>, <span class="gmail-pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">U</span>: <span class="gmail-pl-e" style="box-sizing: border-box; color: rgb(121, 93, 163);"><span class="gmail-pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">Collection</span></span>&gt; {
    <span class="gmail-pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">case</span> <span class="gmail-pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">bar</span>(<span class="gmail-pl-en" style="box-sizing: border-box; color: rgb(121, 93, 163);"><span class="gmail-pl-smi" style="box-sizing: border-box; color: rgb(51, 51, 51);">obj</span></span>: T)
    <span class="gmail-pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">case</span> <span class="gmail-pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">baz</span>(<span class="gmail-pl-en" style="box-sizing: border-box; color: rgb(121, 93, 163);"><span class="gmail-pl-smi" style="box-sizing: border-box; color: rgb(51, 51, 51);">obj</span></span>: U)
}

<span class="gmail-pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);"><span class="gmail-pl-c" style="box-sizing: border-box;">//</span> U is to be casted but it is not even used</span>
<span class="gmail-pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);"></span><span class="gmail-pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">let</span> foo<span class="gmail-pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">:</span> Foo<span class="gmail-pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">&lt;</span><span class="gmail-pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">String</span>, [<span class="gmail-pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">String</span>]<span class="gmail-pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">&gt;</span> <span class="gmail-pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">=</span> .<span class="gmail-pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">bar</span>(<span class="gmail-pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">obj</span>: <span class="gmail-pl-s" style="box-sizing: border-box; color: rgb(24, 54, 145);"><span class="gmail-pl-pds" style="box-sizing: border-box;">"</span>hash<span class="gmail-pl-pds" style="box-sizing: border-box;">"</span></span>)

<span class="gmail-pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);"><span class="gmail-pl-c" style="box-sizing: border-box;">//</span> Creating an optional enum, the generics have to be casted without a value set</span>
<span class="gmail-pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);"><span class="gmail-pl-c" style="box-sizing: border-box;">//</span> The casting is really not needed as the values should be casted not the enum</span>
<span class="gmail-pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);"></span><span class="gmail-pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">var</span> foo1<span class="gmail-pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">:</span> Foo<span class="gmail-pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">&lt;</span><span class="gmail-pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">String</span>, [<span class="gmail-pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">String</span>]<span class="gmail-pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">&gt;?</span>

<span class="gmail-pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);"><span class="gmail-pl-c" style="box-sizing: border-box;">//</span> Collections don’t look great either</span>
<span class="gmail-pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);"></span><span class="gmail-pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">var</span> foos <span class="gmail-pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">=</span> [Foo<span class="gmail-pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">&lt;</span><span class="gmail-pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">String</span>, [<span class="gmail-pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">String</span>]<span class="gmail-pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">&gt;</span>]()
foos.<span class="gmail-pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">append</span>(.<span class="gmail-pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">bar</span>(<span class="gmail-pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">obj</span>:<span class="gmail-pl-s" style="box-sizing: border-box; color: rgb(24, 54, 145);"><span class="gmail-pl-pds" style="box-sizing: border-box;">"</span>hash<span class="gmail-pl-pds" style="box-sizing: border-box;">"</span></span>))</pre></div><p class="" style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(36, 41, 46); font-family: -apple-system, blinkmacsystemfont, 'segoe ui', helvetica, arial, sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol'; font-size: 16px;">Proposed solution</p><div class="gmail-highlight gmail-highlight-source-swift" style="box-sizing: border-box; margin-bottom: 16px; color: rgb(36, 41, 46); font-family: -apple-system, blinkmacsystemfont, 'segoe ui', helvetica, arial, sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol'; font-size: 16px;"><pre class="" style="box-sizing: border-box; font-family: sfmono-regular, consolas, 'liberation mono', menlo, courier, monospace; font-size: 13.600000381469727px; margin-top: 0px; margin-bottom: 0px; line-height: 1.45; word-wrap: normal; padding: 16px; overflow: auto; background-color: rgb(246, 248, 250); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-break: normal;"><span class="gmail-pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">enum</span> <span class="gmail-pl-en" style="box-sizing: border-box; color: rgb(121, 93, 163);">Foo</span> {
    <span class="gmail-pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">case</span> <span class="gmail-pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">bar</span><span class="gmail-pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">&lt;</span>T<span class="gmail-pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">:</span> <span class="gmail-pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">Hashable</span><span class="gmail-pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">&gt;</span>(<span class="gmail-pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">obj</span>: T)
    <span class="gmail-pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">case</span> <span class="gmail-pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">baz</span><span class="gmail-pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">&lt;</span>U<span class="gmail-pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">:</span> <span class="gmail-pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">Collection</span><span class="gmail-pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">&gt;</span>(<span class="gmail-pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">obj</span>: U)
}

<span class="gmail-pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);"><span class="gmail-pl-c" style="box-sizing: border-box;">//</span> generic type inferred on T</span>
<span class="gmail-pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);"></span><span class="gmail-pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">var</span> foo<span class="gmail-pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">:</span> Foo <span class="gmail-pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">=</span> .<span class="gmail-pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">bar</span>(<span class="gmail-pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">obj</span>: <span class="gmail-pl-s" style="box-sizing: border-box; color: rgb(24, 54, 145);"><span class="gmail-pl-pds" style="box-sizing: border-box;">"</span>hash<span class="gmail-pl-pds" style="box-sizing: border-box;">"</span></span>) 

<span class="gmail-pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);"><span class="gmail-pl-c" style="box-sizing: border-box;">//</span> doesn’t need to cast the generic on the optional enum</span>
<span class="gmail-pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);"><span class="gmail-pl-c" style="box-sizing: border-box;">//</span> the associated value will hold the cast</span>
<span class="gmail-pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);"></span><span class="gmail-pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">var</span> foo1<span class="gmail-pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">:</span> Foo<span class="gmail-pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">?</span> 

<span class="gmail-pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);"><span class="gmail-pl-c" style="box-sizing: border-box;">//</span> This also gives better syntax with collections of enums with associated types</span>
<span class="gmail-pl-c" style="box-sizing: border-box; color: rgb(150, 152, 150);"></span><span class="gmail-pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">var</span> foos <span class="gmail-pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">=</span> [Foo]()
foos.<span class="gmail-pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">append</span>(.<span class="gmail-pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">bar</span>(<span class="gmail-pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">obj</span>: <span class="gmail-pl-s" style="box-sizing: border-box; color: rgb(24, 54, 145);"><span class="gmail-pl-pds" style="box-sizing: border-box;">"</span>hey<span class="gmail-pl-pds" style="box-sizing: border-box;">"</span></span>)</pre></div><h2 class="" style="box-sizing: border-box; margin-top: 24px; margin-bottom: 16px; line-height: 1.25; padding-bottom: 0.3em; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(234, 236, 239); color: rgb(36, 41, 46); font-family: -apple-system, blinkmacsystemfont, 'segoe ui', helvetica, arial, sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol';"><a id="gmail-user-content-source-compatibility" class="gmail-anchor" href="https://github.com/lostatseajoshua/swift-evolution/tree/master#source-compatibility" style="box-sizing: border-box; background-color: transparent; color: rgb(3, 102, 214); text-decoration: none; float: left; padding-right: 4px; line-height: 1;"></a>Source compatibility</h2><p class="" style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(36, 41, 46); font-family: -apple-system, blinkmacsystemfont, 'segoe ui', helvetica, arial, sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol'; font-size: 16px;">This may cause subtle breaking changes for areas in code with generic enum cases. The compiler could help with the change by finding the associated generic and updating the case with the new syntax.</p><h2 class="" style="box-sizing: border-box; margin-top: 24px; margin-bottom: 16px; line-height: 1.25; padding-bottom: 0.3em; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(234, 236, 239); color: rgb(36, 41, 46); font-family: -apple-system, blinkmacsystemfont, 'segoe ui', helvetica, arial, sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol';"><a id="gmail-user-content-alternatives-considered" class="gmail-anchor" href="https://github.com/lostatseajoshua/swift-evolution/tree/master#alternatives-considered" style="box-sizing: border-box; background-color: transparent; color: rgb(3, 102, 214); text-decoration: none; float: left; padding-right: 4px; line-height: 1;"></a>Alternatives considered</h2><p class="" style="box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(36, 41, 46); font-family: -apple-system, blinkmacsystemfont, 'segoe ui', helvetica, arial, sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol'; font-size: 16px;">An alternative would be to extend the&nbsp;<code class="" style="box-sizing: border-box; font-family: sfmono-regular, consolas, 'liberation mono', menlo, courier, monospace; font-size: 13.600000381469727px; padding: 0.2em 0px; margin: 0px; background-color: rgba(27, 31, 35, 0.0470588); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;">associatedtype</code>&nbsp;keyword to the enum type.</p><div class="gmail-highlight gmail-highlight-source-swift" style="box-sizing: border-box; margin-bottom: 16px; color: rgb(36, 41, 46); font-family: -apple-system, blinkmacsystemfont, 'segoe ui', helvetica, arial, sans-serif, 'apple color emoji', 'segoe ui emoji', 'segoe ui symbol'; font-size: 16px;"><pre class="" style="box-sizing: border-box; font-family: sfmono-regular, consolas, 'liberation mono', menlo, courier, monospace; font-size: 13.600000381469727px; margin-top: 0px; margin-bottom: 0px; line-height: 1.45; word-wrap: normal; padding: 16px; overflow: auto; background-color: rgb(246, 248, 250); border-top-left-radius: 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; word-break: normal;"><span class="gmail-pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">enum</span> <span class="gmail-pl-en" style="box-sizing: border-box; color: rgb(121, 93, 163);">Foo</span> {
    <span class="gmail-pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">associatedtype</span> T <span class="gmail-pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">=</span> <span class="gmail-pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">Hashable</span>
    <span class="gmail-pl-k" style="box-sizing: border-box; color: rgb(167, 29, 93);">case</span> <span class="gmail-pl-c1" style="box-sizing: border-box; color: rgb(0, 134, 179);">bar</span>(<span class="gmail-pl-en" style="box-sizing: border-box; color: rgb(121, 93, 163);"><span class="gmail-pl-smi" style="box-sizing: border-box; color: rgb(51, 51, 51);">obj</span></span>: T)
}</pre></div></div><div class=""><br class=""></div>Copy of proposal can be found here&nbsp;<a href="https://github.com/lostatseajoshua/swift-evolution/blob/master/NNNN-enum-generic-cases.md" class="">Swift proposal on github</a><div class=""><div class=""><br class=""></div>--<span class="Apple-converted-space">&nbsp;</span><br class=""><div class="gmail_signature">Joshua Alvarado<div class=""><a href="mailto:alvaradojoshua0@gmail.com" target="_blank" class="">alvaradojoshua0@gmail.com</a></div></div></div></div>_______________________________________________<br class="">swift-evolution mailing list<br class=""><a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a><br class=""><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" class="">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br class=""></div></blockquote></div><br class=""></div></div></div>_______________________________________________<br class="">swift-evolution mailing list<br class=""><a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a><br class=""><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" class="">https://lists.swift.org/mailman/listinfo/swift-evolution</a></div></blockquote></div></blockquote></div><br class=""></div></blockquote></body></html>