<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=""><br class=""><div><blockquote type="cite" class=""><div class="">On Aug 21, 2017, at 10:31 AM, Adrian Zubarev <<a href="mailto:adrian.zubarev@devandartist.com" class="">adrian.zubarev@devandartist.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><br class="Apple-interchange-newline"><span style="font-family: Helvetica, Arial; font-size: 13px; 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-stroke-width: 0px; float: none; display: inline !important;" class="">Hi Matthew thank you for remembering us about that draft. I’ll re-read it soon. At the a quick glance I noticed the extent use of the `where` clause. Wouldn’t make sense to simplify the main proposal and just focus on the `where` clause for typealises only? It’s already a complex feature on its own. Permitting the `where` clause in different places can sill be added later in the future.</span><br style="font-family: Helvetica, Arial; font-size: 13px; 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-stroke-width: 0px;" class=""></div></blockquote><div><br class=""></div><div>At first glance, it looks to me like the typealias would need to refer to a generalized existential anyway and if we can do that through a typealias we should probably be able to do it directly as well. That said, if it simplifies the implementation in some way it might make sense as a first step. Whether or not that would be the case is something I can’t speak to with any confidence.</div><br class=""><blockquote type="cite" class=""><div class=""><div id="bloop_sign_1503329141662461952" class="bloop_sign" style="font-family: Helvetica, Arial; font-size: 13px; 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-stroke-width: 0px;"></div><br style="font-family: Helvetica, Arial; font-size: 13px; 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-stroke-width: 0px;" class=""><p class="airmail_on" style="font-family: Helvetica, Arial; font-size: 13px; 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-stroke-width: 0px;">Am 21. August 2017 um 15:10:34, Matthew Johnson (<a href="mailto:matthew@anandabits.com" class="">matthew@anandabits.com</a>) schrieb:</p><blockquote type="cite" class="clean_bq" style="font-family: Helvetica, Arial; font-size: 13px; 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;"><span class=""><div dir="auto" class=""><div class=""></div><div class=""><div class=""><span style="background-color: rgba(255, 255, 255, 0);" class="">If anyone is thinking about spending time on this topic I recommend beginning by reviewing the prior work that was done by Austin Zheng. He has a proposal draft for enhanced existential that is very thorough. Even if you're not planning to propose everything that's included in his draft it would be a good idea to be familiar with it. Here's the link: <a href="https://github.com/austinzheng/swift-evolution/blob/az-existentials/proposals/XXXX-enhanced-existentials.md" class="">https://github.com/austinzheng/swift-evolution/blob/az-existentials/proposals/XXXX-enhanced-existentials.md</a>.<br class=""></span><br class="">Sent from my iPad</div><div class=""><br class="">On Aug 21, 2017, at 6:36 AM, Adrian Zubarev via swift-evolution <<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>> wrote:<br class=""><br class=""></div><blockquote type="cite" class=""><div class=""><div class="bloop_markdown"><p class="">It’s part of Generalized Existentials, but does not make it complete. I think it would be worth adding more and more functionality to existentials every year. We started first with reshaping the syntax. This year we added support for classes. I think next year would be good to have<span class="Apple-converted-space"> </span><code class="">where</code><span class="Apple-converted-space"> </span>clause support for typealiases.</p><p class="">I understand the complexity of that particular feature, and it’s a no-go for me to help on the implementation, but I’m willing to drive the discussion and the proposal forward with other co-authors. :)</p><p class="">Hasn’t it been said that the implementation must be at least a *proof-of-concept* if the complexity is very high?</p><p class="">And my second question is: Wouldn’t the existence of this feature reshape some parts of the standard library, isn’t that affecting some major goals of Swift 5?</p><p class="">It would be nice if someone from the core team can clarify if the<span class="Apple-converted-space"> </span><code class="">where</code><span class="Apple-converted-space"> </span>clause is out of scope for Swift 5 or not.</p></div><div class="bloop_original_html"><div id="bloop_customfont" style="font-family: Helvetica, Arial; font-size: 13px; margin: 0px;" class=""><br class=""></div><br class=""><div id="bloop_sign_1503314850459755776" class="bloop_sign"></div><br class=""><p class="airmail_on">Am 21. August 2017 um 12:51:48, David Hart (<a href="mailto:david@hartbit.com" class="">david@hartbit.com</a>) schrieb:</p><blockquote type="cite" class="clean_bq"><div class="" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><div class=""><span class=""><br class=""></span><div class=""><blockquote type="cite" class=""><div class=""><span class="">On 21 Aug 2017, at 11:41, Adrian Zubarev <<a href="mailto:adrian.zubarev@devandartist.com" class="">adrian.zubarev@devandartist.com</a>> wrote:</span></div><span class=""><br class="Apple-interchange-newline"></span><div class=""><div id="bloop_customfont" class="" style="font-family: Helvetica, Arial; font-size: 13px; 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; margin: 0px;"><span class="">Yes, `where` clause is welcome to typealises (including generic ones) and existentials in general. I would love to help on such proposal. I think David Hart is also interested in this one. (cc)</span></div></div></blockquote><div class=""><span class=""><br class=""></span></div><div class=""><span class="">Yes, this basically seems like<span class="Apple-converted-space"> </span><b class="">Generalized Existentials</b><span class="Apple-converted-space"> </span>to me and is mentioned in the <a href="https://github.com/apple/swift/blob/master/docs/GenericsManifesto.md" class="">Generics Manifesto</a>. It’s a feature I hold very dear but:</span></div><div class=""><span class=""><br class=""></span></div><div class=""><ul class="MailOutline"><li class=""><span class="">It’s a very difficult feature to implement and I think Doug Gregor is the only/best person to do it</span></li><li class=""><span class="">I think its pretty much out of scope for Swift 5 (it’s not required for ABI Stability)</span></li></ul><div class=""><span class=""><br class=""></span></div><div class=""><span class="">As a result, I’d be very surprised if this topic got any discussion or implementation time during the Swift 5 timeframe.</span></div></div><blockquote type="cite" class=""><div class=""><p class="airmail_on" style="font-family: Helvetica, Arial; font-size: 13px; 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;"><span class="">Am 21. August 2017 um 11:38:14, Gor Gyolchanyan via swift-evolution (<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>) schrieb:</span></p><blockquote type="cite" class="clean_bq" style="font-family: Helvetica, Arial; font-size: 13px; 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-stroke-width: 0px;"><div class="" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><div class=""></div><div class=""><span class=""><span class="">Hello, Swift community!</span></span><div class=""><span class=""><br class=""></span></div><div class=""><span class="">I'd like to start a discussion about a possibility of constrained protocol aliases. The declaration would look like this:</span></div><div class=""><span class=""><br class=""></span></div><div class=""><div class=""><span class=""><font face="Menlo" class=""><font color="#941751" class="">typealias</font><span class="Apple-converted-space"> </span><font color="#008F00" class="">BinaryProtocol</font><span class="Apple-converted-space"> </span>=<span class="Apple-converted-space"> </span><font color="#008F00" class="">RandomAccessCollection</font><span class="Apple-converted-space"> </span>&<span class="Apple-converted-space"> </span><font color="#008F00" class="">MutablCollection</font><span class="Apple-converted-space"> </span>&<span class="Apple-converted-space"> </span><font color="#008F00" class="">RangeReplaceableCollection</font><span class="Apple-converted-space"> </span><font color="#941751" class="">where</font> <font color="#008F00" class="">Binary</font>.<font color="#008F00" class="">Index</font><span class="Apple-converted-space"> </span>==<span class="Apple-converted-space"> </span><font color="#008F00" class="">Int</font>,<span class="Apple-converted-space"> </span><font color="#008F00" class="">Binary</font>.<font color="#008F00" class="">Element</font><span class="Apple-converted-space"> </span>==<span class="Apple-converted-space"> </span><font color="#008F00" class="">Bool</font></font></span></div></div><div class=""><br class=""></div><div class="">The syntax and semantics of this declaration are exactly the same as an analogous<span class="Apple-converted-space"> </span><font color="#941751" face="Menlo" class="">associatedtype</font><span class="Apple-converted-space"> </span>declaration inside a protocol.</div><div class="">In the example above, the type<span class="Apple-converted-space"> </span><font face="Menlo" color="#008F00" class="">BinaryProtocol</font> represents a logical array of bits and is a generic-only protocol that is usable in any context where an integer-indexed mutable range-replaceable random-access collection is expected.</div><div class="">Now, it can be used in a very concise and elegant way:</div><div class=""><br class=""></div><div class=""><font face="Menlo" class=""><font color="#941751" class="">public</font><span class="Apple-converted-space"> </span><font color="#941751" class="">protocol</font><span class="Apple-converted-space"> </span><font color="#008F00" class="">BinaryInitializable</font><span class="Apple-converted-space"> </span>{</font></div><div class=""><font face="Menlo" class=""><font color="#941751" class="">init</font><<font color="#008F00" class="">Binary</font>>(binary:<span class="Apple-converted-space"> </span><font color="#008F00" class="">Binary</font>)<span class="Apple-converted-space"> </span><font color="#941751" class="">where</font><span class="Apple-converted-space"> </span><font color="#008F00" class="">Binary</font>:<span class="Apple-converted-space"> </span><font color="#008F00" class="">BinaryProtocol</font></font></div><div class=""><font face="Menlo" class="">}</font></div><div class=""><br class=""></div><div class="">which would otherwise look very verbose and inelegant:</div><div class=""><br class=""></div><div class=""><font face="Menlo" class=""><font color="#941751" class="">public</font><span class="Apple-converted-space"> </span><font color="#941751" class="">protocol</font><span class="Apple-converted-space"> </span><font color="#008F00" class="">BinaryInitializable</font><span class="Apple-converted-space"> </span>{</font></div><div class=""><font face="Menlo" class=""><font color="#941751" class="">init</font><<font color="#008F00" class="">Binary</font>>(binary:<span class="Apple-converted-space"> </span><font color="#008F00" class="">Binary</font>)<span class="Apple-converted-space"> </span><font color="#941751" class="">where</font><span class="Apple-converted-space"> </span>Binary: <font color="#008F00" class="">RandomAccessCollection</font> & <font color="#008F00" class="">MutablCollection</font> & <font color="#008F00" class="">RangeReplaceableCollection,</font> <font color="#008F00" class="">Binary</font>.<font color="#008F00" class="">Index</font> == <font color="#008F00" class="">Int</font>, <font color="#008F00" class="">Binary</font>.<font color="#008F00" class="">Element</font> == <font color="#008F00" class="">Bool</font></font></div><div class=""><font face="Menlo" class="">}</font></div><div class=""><div class=""><br class=""></div><div class="">Considering that smaller sets of constraints could be aliased to their own protocol and then composited into more complex aliases, this feature would dramatically improve readability and maintainability of code that uses complex constraints, that currently leads to arcane mess:</div><div class=""><br class=""></div><div class=""><font face="Menlo" class=""><font color="#941751" class="">struct</font> <font color="#008F00" class="">Mirror</font> {</font></div><div class=""><ul class="container" style="box-sizing: border-box; margin: 0px; padding: 0px; width: auto; list-style: none;"><li class=""><font face="Menlo" class=""><font color="#797979" class="">/// ...</font></font></li><li class=""><font face="Menlo" class=""><font color="#941751" class="">init</font><<font color="#008F00" class="">Subject</font>, <font color="#008F00" class="">C</font> <font color="#941751" class="">where</font> <font color="#008F00" class="">C</font> : <font color="#008F00" class="">Collection</font>, <font color="#008F00" class="">C</font>.<font color="#008F00" class="">Indices</font> : <font color="#008F00" class="">Collection</font>, <font color="#008F00" class="">C</font>.<font color="#008F00" class="">SubSequence</font> : <font color="#008F00" class="">Collection</font>, <font color="#008F00" class="">C</font>.<font color="#008F00" class="">Indices</font>.<font color="#008F00" class="">Index</font> == <font color="#008F00" class="">C</font>.<font color="#008F00" class="">Index</font>, <font color="#008F00" class="">C</font>.<font color="#008F00" class="">Indices</font>.<font color="#008F00" class="">SubSequence</font> == <font color="#008F00" class="">C</font>.<font color="#008F00" class="">Indices</font>, <font color="#008F00" class="">C</font>.<font color="#008F00" class="">Iterator</font>.<font color="#008F00" class="">Element</font> == <font color="#008F00" class="">Mirror</font>.<font color="#008F00" class="">Child</font>, <font color="#008F00" class="">C</font>.<font color="#008F00" class="">SubSequence</font>.<font color="#008F00" class="">Index</font> == <font color="#008F00" class="">C</font>.<font color="#008F00" class="">Index</font>, <font color="#008F00" class="">C</font>.<font color="#008F00" class="">SubSequence</font>.<font color="#008F00" class="">Indices</font> : <font color="#008F00" class="">Collection</font>, <font color="#008F00" class="">C</font>.<font color="#008F00" class="">SubSequence</font>.<font color="#008F00" class="">SubSequence</font> == <font color="#008F00" class="">C</font>.<font color="#008F00" class="">SubSequence</font>, <font color="#008F00" class="">C</font>.<font color="#008F00" class="">Indices</font>.<font color="#008F00" class="">Iterator</font>.<font color="#008F00" class="">Element</font> == <font color="#008F00" class="">C</font>.<font color="#008F00" class="">Index</font>, <font color="#008F00" class="">C</font>.<font color="#008F00" class="">SubSequence</font>.<font color="#008F00" class="">Indices</font>.<font color="#008F00" class="">Index</font> == <font color="#008F00" class="">C</font>.<font color="#008F00" class="">Index</font>, <font color="#008F00" class="">C</font>.<font color="#008F00" class="">SubSequence</font>.<font color="#008F00" class="">Indices</font>.<font color="#008F00" class="">SubSequence</font> == <font color="#008F00" class="">C</font>.<font color="#008F00" class="">SubSequence</font>.<font color="#008F00" class="">Indices</font>, <font color="#008F00" class="">C</font>.<font color="#008F00" class="">SubSequence</font>.<font color="#008F00" class="">Iterator</font>.<font color="#008F00" class="">Element</font> == <font color="#008F00" class="">Mirror</font>.<font color="#008F00" class="">Child</font>, <font color="#008F00" class="">C</font>.<font color="#008F00" class="">SubSequence</font>.<font color="#008F00" class="">Indices</font>.<font color="#008F00" class="">Iterator</font>.<font color="#008F00" class="">Element</font> == <font color="#008F00" class="">C</font>.<font color="#008F00" class="">Index</font>>(_ subject: <font color="#008F00" class="">Subject</font>, children: <font color="#008F00" class="">C</font>, displayStyle: <font color="#008F00" class="">Mirror</font>.<font color="#008F00" class="">DisplayStyle</font>? = <font color="#941751" class="">default</font>, ancestorRepresentation: <font color="#008F00" class="">Mirror</font>.<font color="#008F00" class="">AncestorRepresentation</font> = <font color="#941751" class="">default</font>)</font></li></ul><div class=""><font face="Menlo" color="#797979" class="">/// ...</font></div></div><div class=""><font face="Menlo" class="">}</font></div></div><div class=""><font face="Menlo" class=""><br class=""></font></div><div class=""><span class="" style="font-family: Menlo;"><br class=""></span></div><div class=""><font color="#797979" face="Menlo" class="">/// A collection that is its own sub-sequence</font></div><div class=""><font face="Menlo" class=""><font color="#941751" class="">typealias</font><span class="Apple-converted-space"> </span><font color="#008F00" class="">RecursivelySliceableCollection</font><span class="Apple-converted-space"> </span>=<span class="Apple-converted-space"> </span><font color="#008F00" class="">Collection</font><span class="Apple-converted-space"> </span><font color="#941751" class="">where</font></font></div><div class=""><font color="#008F00" face="Menlo" class="">RecursivelySliceableCollection</font><span class="" style="font-family: Menlo;">.</span><font color="#008F00" face="Menlo" class="">SubSequence</font><font face="Menlo" class="">:<span class="Apple-converted-space"> </span><font color="#008F00" class="">Collection</font>,</font></div><div class=""><font color="#008F00" face="Menlo" class="">RecursivelySliceableCollection</font><span class="" style="font-family: Menlo;">.</span><font color="#008F00" face="Menlo" class="">SubSequence</font><span class="" style="font-family: Menlo;">.</span><font color="#008F00" face="Menlo" class="">Element</font><span class="Apple-converted-space"> </span><span class="" style="font-family: Menlo;">== </span><font color="#008F00" face="Menlo" class="">RecursivelySliceableCollection</font><span class="" style="font-family: Menlo;">.</span><font color="#008F00" face="Menlo" class="">Element</font></div><div class=""><font color="#008F00" face="Menlo" class="">RecursivelySliceableCollection</font><span class="" style="font-family: Menlo;">.</span><font color="#008F00" face="Menlo" class="">SubSequence</font><span class="" style="font-family: Menlo;">.</span><font color="#008F00" face="Menlo" class="">Indices</font><span class="Apple-converted-space"> </span><span class="" style="font-family: Menlo;">== </span><font color="#008F00" face="Menlo" class="">RecursivelySliceableCollection</font><span class="" style="font-family: Menlo;">.</span><font color="#008F00" face="Menlo" class="">Indices</font><span class="" style="font-family: Menlo;">,</span></div><div class=""><font color="#008F00" face="Menlo" class="">RecursivelySliceableCollection</font><span class="" style="font-family: Menlo;">.</span><font color="#008F00" face="Menlo" class="">SubSequence</font><span class="" style="font-family: Menlo;">.</span><font color="#008F00" face="Menlo" class="">SubSequence</font><span class="Apple-converted-space"> </span><span class="" style="font-family: Menlo;">== </span><font color="#008F00" face="Menlo" class="">RecursivelySliceableCollection</font><span class="" style="font-family: Menlo;">.</span><font color="#008F00" face="Menlo" class="">SubSequence</font></div><div class=""><font face="Menlo" class=""><br class=""></font></div><div class=""><font color="#797979" face="Menlo" class="">/// A collection that is its own index collection</font></div><div class=""><font color="#941751" face="Menlo" class="">typealias</font><span class="Apple-converted-space"> </span><font color="#008F00" face="Menlo" class="">RecursivelyIndexableCollection</font><span class="Apple-converted-space"> </span><span class="" style="font-family: Menlo;">=</span><span class="Apple-converted-space"> </span><font color="#008F00" face="Menlo" class="">Collection</font><span class="Apple-converted-space"> </span><font color="#941751" face="Menlo" class="">where</font></div><div class=""><font color="#008F00" face="Menlo" class="">RecursivelyIndexableCollection</font><span class="" style="font-family: Menlo;">.</span><font color="#008F00" face="Menlo" class="">Indices</font><span class="Apple-converted-space"> </span><span class="" style="font-family: Menlo;">== </span><font color="#008F00" face="Menlo" class="">RecursivelySliceableCollection</font><span class="" style="font-family: Menlo;">,</span></div><div class=""><font color="#008F00" face="Menlo" class="">RecursivelyIndexableCollection</font><span class="" style="font-family: Menlo;">.</span><font color="#008F00" face="Menlo" class="">Indices</font><span class="" style="font-family: Menlo;">.</span><font color="#008F00" face="Menlo" class="">Index</font><span class="Apple-converted-space"> </span><span class="" style="font-family: Menlo;">== </span><font color="#008F00" face="Menlo" class="">RecursivelyIndexableCollection</font><span class="" style="font-family: Menlo;">.</span><font color="#008F00" face="Menlo" class="">Index</font><span class="" style="font-family: Menlo;">,</span></div><div class=""><span class="" style="font-family: Menlo;"><br class=""></span></div><div class=""><font color="#941751" face="Menlo" class="">struct</font><span class="Apple-converted-space"> </span><span class="" style="font-family: Menlo;">Mirror {</span></div><div class=""><font color="#797979" face="Menlo" class="">/// ...</font></div><div class=""><font color="#941751" face="Menlo" class="">init</font><span class="" style="font-family: Menlo;"><</span><font color="#008F00" face="Menlo" class="">Subject</font><span class="" style="font-family: Menlo;">,</span><span class="Apple-converted-space"> </span><font color="#008F00" face="Menlo" class="">C</font><span class="" style="font-family: Menlo;">: </span><font color="#008F00" face="Menlo" class="">RecursivelySliceableCollection</font><span class="Apple-converted-space"> </span><span class="" style="font-family: Menlo;">& </span><font color="#008F00" face="Menlo" class="">RecursivelyIndexableCollection</font><span class="" style="font-family: Menlo;">, </span><font color="#941751" face="Menlo" class="">where</font> <font color="#008F00" face="Menlo" class="">C</font><span class="" style="font-family: Menlo;">.</span><font color="#008F00" face="Menlo" class="">Element</font><span class="Apple-converted-space"> </span><span class="" style="font-family: Menlo;">==</span><span class="Apple-converted-space"> </span><font color="#008F00" face="Menlo" class="">Mirror</font><span class="" style="font-family: Menlo;">.</span><font color="#008F00" face="Menlo" class="">Child</font><span class="" style="font-family: Menlo;">>(</span><span class="" style="font-family: Menlo;">_ subject:</span><span class="" style="font-family: Menlo;"> </span><font color="#008F00" class="" style="font-family: Menlo;">Subject</font><span class="" style="font-family: Menlo;">, children:</span><span class="" style="font-family: Menlo;"> </span><font color="#008F00" class="" style="font-family: Menlo;">C</font><span class="" style="font-family: Menlo;">, displayStyle:</span><span class="" style="font-family: Menlo;"> </span><font color="#008F00" class="" style="font-family: Menlo;">Mirror</font><span class="" style="font-family: Menlo;">.</span><font color="#008F00" class="" style="font-family: Menlo;">DisplayStyle</font><span class="" style="font-family: Menlo;">? =</span><span class="" style="font-family: Menlo;"> </span><font color="#941751" class="" style="font-family: Menlo;">default</font><span class="" style="font-family: Menlo;">, ancestorRepresentation:</span><span class="" style="font-family: Menlo;"> </span><font color="#008F00" class="" style="font-family: Menlo;">Mirror</font><span class="" style="font-family: Menlo;">.</span><font color="#008F00" class="" style="font-family: Menlo;">AncestorRepresentation</font><span class="" style="font-family: Menlo;"> </span><span class="" style="font-family: Menlo;">=</span><span class="" style="font-family: Menlo;"> </span><font color="#941751" class="" style="font-family: Menlo;">default</font><span class="" style="font-family: Menlo;">)</span></div><div class=""><font color="#797979" face="Menlo" class="">/// ...</font></div><div class=""><span class="" style="font-family: Menlo;">}</span></div><div class=""><br class=""></div><div class="">Even considering that the proposal SE-0157 (<a href="https://github.com/apple/swift-evolution/blob/master/proposals/0157-recursive-protocol-constraints.md" class="">https://github.com/apple/swift-evolution/blob/master/proposals/0157-recursive-protocol-constraints.md</a>) is going to make this specific use case a non-issue, the principle applies to all cases where there are commonly used complex constraints that don't necessarily involve recursive constraints.</div><div class=""><br class=""></div><div class=""><b class="">Specializing Generic-Only Protocols For Non-Generic Use</b></div><div class=""><br class=""></div><div class="">An additional feature that would prove to be very useful would be to make a constrained protocol alias be a non-generic-only protocol if the constraints of the alias declaration specify a same-type requirement for all its associated types, while defaulted associated types would also count.</div><div class="">Example:</div><div class=""><br class=""></div><div class=""><font face="Menlo" class=""><font color="#941751" class="">protocol</font><span class="Apple-converted-space"> </span><font color="#008F00" class="">Consumer</font><span class="Apple-converted-space"> </span>{</font></div><div class=""><font face="Menlo" class=""><font color="#941751" class="">associatedtype</font><span class="Apple-converted-space"> </span><font color="#008F00" class="">Consumable</font></font></div><div class=""><font face="Menlo" class=""><font color="#941751" class="">mutating</font> <font color="#941751" class="">func</font><span class="Apple-converted-space"> </span>consume(_ consumable:<span class="Apple-converted-space"> </span><font color="#008F00" class="">Consumable</font>)<span class="Apple-converted-space"> </span><font color="#941751" class="">throws</font></font></div><div class=""><font face="Menlo" class="">}</font></div><div class=""><font face="Menlo" class=""><br class=""></font></div><div class=""><font face="Menlo" class=""><font color="#941751" class="">var</font><span class="Apple-converted-space"> </span>consumer0:<span class="Apple-converted-space"> </span><font color="#008F00" class="">Consumer</font><span class="Apple-converted-space"> </span><font color="#797979" class="">// </font></font><span class="" style="font-family: Menlo;"><i class=""><font color="#FF2600" class="">error: Consumer is only usable in a generic context</font></i></span></div><div class=""><font face="Menlo" class=""><br class=""></font></div><div class=""><font face="Menlo" class=""><font color="#941751" class="">typealias</font><span class="Apple-converted-space"> </span><font color="#008F00" class="">CharacterConsumer</font><span class="Apple-converted-space"> </span>=<span class="Apple-converted-space"> </span><font color="#008F00" class="">Consumer</font><span class="Apple-converted-space"> </span><font color="#941751" class="">where </font> </font><span class="" style="color: rgb(0, 143, 0); font-family: Menlo;">Character</span><font face="Menlo" class=""><font color="#008F00" class="">Consumer</font>.<font color="#008F00" class="">Consumable</font><span class="Apple-converted-space"> </span>== </font><span class="" style="color: rgb(0, 143, 0); font-family: Menlo;">Character</span></div><div class=""><font face="Menlo" class=""><br class=""></font></div><div class=""><font face="Menlo" class=""><font color="#941751" class="">var</font><span class="Apple-converted-space"> </span>consumer1: </font><span class="" style="color: rgb(0, 143, 0); font-family: Menlo;">Character</span><font face="Menlo" class=""><font color="#008F00" class="">Consumer</font><span class="Apple-converted-space"> </span><font color="#797979" class="">// OK</font></font></div><div class=""><br class=""></div><div class="">The current workaround would be to declare a new protocol with protocol inheritance clauses and a<span class="Apple-converted-space"> </span><font color="#941751" face="Menlo" class="">where</font><span class="Apple-converted-space"> </span>clause, but the major downside is that it introduces a completely new protocol that is not compatible with any context that expects the underlying protocols and their constraints.</div><div class=""><br class=""></div><div class="">Regards,</div><div class="">Gor Gyolchanyan.</div><div class=""><br class=""></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></div></blockquote></div></blockquote></div><br class=""></div></div></blockquote></div><div class="bloop_markdown"></div></div></blockquote><blockquote type="cite" class=""><div class=""><span class="">_______________________________________________</span><br class=""><span class="">swift-evolution mailing list</span><br class=""><span class=""><a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a></span><br class=""><span class=""><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" class="">https://lists.swift.org/mailman/listinfo/swift-evolution</a></span></div></blockquote></div></div></span></blockquote></div></blockquote></div><br class=""></body></html>