<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">I uploaded my proposal for strong type-aliases at &lt;<a href="https://gist.github.com/CTMacUser/c493f775075e946efdcfd85d38473291" class="">https://gist.github.com/CTMacUser/c493f775075e946efdcfd85d38473291</a>&gt;. My brain is somewhat fried from working for several days writing and rewriting this, so new sets of eyes finding issues is appreciated.</div><div class=""><br class=""></div><div class="">* I originally had “retype” as the name, but it’s strictly a verb while “struct(ure),” “enum(eration),” and “class” are nouns, hence “alter(native).” Maybe there's an even better name out there? The header looks a little funny because the type being altered is after the colon, and not the identifier immediately next to “alter”.</div><div class="">* A lot of the text is a consequence of the restriction/validation dynamic, should that be dropped? Dropped for now? Note that dropping it will require sum alternative types to include all of the cases from their implementation type.</div><div class="">* If a bunch of members are introduced from the implementation type as a set of function overloads or a protocol set, should there be a way for a directly-defined member to shadow over a published member instead of co-existing as overloads? For instance:</div><div class=""><br class=""></div><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;" class=""><div class=""><font face="Monaco" class="">alter MyInt16: Int16, Hashable {</font></div></blockquote><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;" class=""><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;" class=""><div class=""><font face="Monaco" class="">publish Equatable</font></div></blockquote><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;" class=""><div class=""><font face="Monaco" class="">var hashValue: Int {</font></div></blockquote></blockquote><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;" class=""><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;" class=""><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;" class=""><div class=""><font face="Monaco" class="">return 2000 &amp;+ super.hashValue</font></div></blockquote></blockquote></blockquote><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;" class=""><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;" class=""><div class=""><font face="Monaco" class="">}</font></div></blockquote></blockquote><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;" class=""><div class=""><font face="Monaco" class="">}</font></div></blockquote><div class=""><br class=""></div><div class="">If I change the published protocol to Hashable, I’d get an illegal overload error. Should it be changed to let a directly-defined member override a published one? If so, should a plain declaration work, or should “override” be added to the directly defined version (so an unintentional shadowing is flagged as an error)?</div><div class=""><br class=""></div><div class="">* If we keep restrictions, what about protocols that return or otherwise output Self? They could return values that are valid for the implementation type but not the current alternative type. How can I fix this co-variance/contra-variance mismatch? Or is this an argument to drop restricted alternative types?</div><div class=""><br class=""></div><div class="">
<div style="color: rgb(0, 0, 0); letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">—&nbsp;</div><div class="">Daryle Walker<br class="">Mac, Internet, and Video Game Junkie<br class="">darylew AT mac DOT com&nbsp;</div></div>
</div>
<br class=""></body></html>