<div dir="ltr">Commented on the proposal but realize that it might be better to reply here. <div><br></div><div>For clarification: when you say &quot;deprecate typealias&quot; do you mean only in the context of associated types or in the language as a whole?</div><div> </div><div>I also thought it might make sense to add to the proposal a disabling of the &quot;default&quot; behavior that is currently allowed for type aliases in protocols:</div><div><br></div><div>protocol Prot {</div><div>    associated Container: SequenceType</div><div>    associated Element = Container.Generator.Element // should be illegal</div><div>}</div><div><br></div><div>Instead, if you actually want the semantics of an additional associated type with a default (but overridable) value, you should use a protocol extension. (Which means that associated ____ = ____ would be allowed in protocol extensions, but not associated ____ : _____  or associated ____ : ____ = _____.) Does that sound right?</div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sun, Dec 6, 2015 at 10:32 AM, Loïc Lecrenier <span dir="ltr">&lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Well, I went ahead and created a pull request :)<br>
<br>
I also included a “proposed approach” section, where I propose to deprecate<br>
the `typealias` keyword for Swift 2.2, and replace it entirely for Swift 3.0.<br>
<br>
Does anyone have any thought on that? This is a bit aggressive, but I think it’s worth it.<br>
It is actually the same approach Erica proposed for removing C for-loops.<br>
<span class="HOEnZb"><font color="#888888"><br>
Loïc<br>
</font></span><div class="HOEnZb"><div class="h5"><br>
&gt; On Dec 6, 2015, at 1:12 PM, Loïc Lecrenier &lt;<a href="mailto:loiclecrenier@icloud.com">loiclecrenier@icloud.com</a>&gt; wrote:<br>
&gt;<br>
&gt; I have drafted a formal proposal here: <a href="https://gist.github.com/loiclec/22459d230a21dbcb81fc" rel="noreferrer" target="_blank">https://gist.github.com/loiclec/22459d230a21dbcb81fc</a><br>
&gt; Would love to receive feedback from the community on it, I am particularly worried about the correctness of the terms I used.<br>
&gt; Should I make a pull request to swift-evolution now, or should we continue the conversation here?<br>
&gt;<br>
&gt; Thanks,<br>
&gt;<br>
&gt; Loïc<br>
&gt;<br>
&gt; (and sorry about emailing you on Sunday 😇 )<br>
&gt;<br>
&gt;&gt; On Dec 6, 2015, at 1:48 AM, John McCall &lt;<a href="mailto:rjmccall@apple.com">rjmccall@apple.com</a>&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt;&gt; On Dec 5, 2015, at 4:35 PM, Loïc Lecrenier via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br>
&gt;&gt;&gt; Hi everyone :)<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; I propose introducing a new &quot;associated_type&quot; keyword that will replace &quot;typealias&quot; for declaring associated types in protocols.<br>
&gt;&gt;&gt; I remember being confused by associated types when I started using Swift, and I think one reason why was the use of the typealias keyword to define them.<br>
&gt;&gt;&gt; One reason was that I thought I knew what typealias did, and so I didn&#39;t stop to learn what it did inside a protocol. An other reason was the difficulty of finding help when searching for &quot;typealias&quot; instead of &quot;associated types&quot;.<br>
&gt;&gt;&gt; Then, when I thought I understood it, I started building an excessively protocol-oriented program as an exercise. And I still lost a lot of time fighting Swift by trying to use &quot;real&quot; typealias-es inside of protocols.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Conceptually, I had something like this:<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; protocol ProtA {<br>
&gt;&gt;&gt; typealias Container : SequenceType<br>
&gt;&gt;&gt; }<br>
&gt;&gt;&gt; protocol ProtB {<br>
&gt;&gt;&gt; typealias AnOtherAssocType : ProtA<br>
&gt;&gt;&gt; func foo(x: AnOtherAssocType.Container.Generator.Element, y: AnOtherAssocType.Container.Generator.Element) -&gt; AnOtherAssocType.Container.Generator.Element<br>
&gt;&gt;&gt; }<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; The function foo is very difficult to read, so I wanted to use a shortcut to Element by doing this:<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; protocol ProtB {<br>
&gt;&gt;&gt; typealias A : ProtA<br>
&gt;&gt;&gt; typealias Element = A.Container.Generator.Element<br>
&gt;&gt;&gt; func foo(x: Element, y: Element) -&gt; Element<br>
&gt;&gt;&gt; }<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; But by doing so, I didn&#39;t create a shortcut to Element, but an associated type with a default value of Element. (right?)<br>
&gt;&gt;&gt; Then I tried to write extensions to ProtB where Element conforms to, say, Equatable, and couldn&#39;t make it work because A.Container.Generator.Element didn&#39;t conform to Equatable.<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; So, that was a rather long explanation of the reasons I think we should replace the typealias keyword by associated_type, and allow &quot;real&quot; typealias-es inside protocols.<br>
&gt;&gt;<br>
&gt;&gt; I think this is a great idea; re-using typealias for associated types was a mistake.<br>
&gt;&gt;<br>
&gt;&gt; John.<br>
&gt;&gt;<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Ideally, I would write<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; protocol ProtB {<br>
&gt;&gt;&gt; associated_type AnOtherAssocType : ProtA<br>
&gt;&gt;&gt; typealias Element = AnOtherAssocType.Container.Generator.Element<br>
&gt;&gt;&gt; func foo(x: Element, y: Element) -&gt; Element<br>
&gt;&gt;&gt; }<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; and it would be exactly the same as<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; protocol ProtB {<br>
&gt;&gt;&gt; associated_type AnOtherAssocType : ProtA<br>
&gt;&gt;&gt; func foo(x: A.Container.Generator.Element, y: A.Container.Generator.Element) -&gt; A.Container.Generator.Element<br>
&gt;&gt;&gt; }<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; There are probably some problems created by this proposal, but right now I can&#39;t see any :/<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Thanks,<br>
&gt;&gt;&gt;<br>
&gt;&gt;&gt; Loïc<br>
&gt;&gt;&gt; _______________________________________________<br>
&gt;&gt;&gt; swift-evolution mailing list<br>
&gt;&gt;&gt; <a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br>
&gt;&gt;&gt; <a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
&gt;<br>
<br>
_______________________________________________<br>
swift-evolution mailing list<br>
<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br>
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
</div></div></blockquote></div><br></div>