Thanks for clarifying `protocol&lt;A, B&gt;`. In that case <font size="2"><span style="background-color:rgba(255,255,255,0)"> `protocol&lt;A, B&gt;` is not necessarily an error for traits, but the ambiguity needs resolving. <span></span></span></font><br><br>On Sunday, 28 February 2016, Joe Groff via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Howard Lovatt via swift-evolution<br>
&lt;<a href="javascript:;" onclick="_e(event, &#39;cvml&#39;, &#39;swift-evolution@swift.org&#39;)">swift-evolution@swift.org</a>&gt; wrote:<br>
&gt; I like the proposal but would suggest you rename it Trait and not Mixin,<br>
&gt; since you proposal has Trait and not Mixin behaviour. The difference is<br>
&gt; that the order of inheritance is not important with Traits but is with<br>
&gt; Mixins, EG:<br>
&gt;<br>
&gt;     protocol A { let msg = &quot;A&quot; }<br>
&gt;     protocol B { let msg = &quot;B&quot; }<br>
&gt;     struct MixinAB: A, B {}<br>
&gt;     MixinAB().msg // B<br>
&gt;<br>
&gt;   Whereas<br>
&gt;<br>
&gt;     struct MixinBA: B, A {}<br>
&gt;     MixinBA().msg // A<br>
&gt;<br>
&gt; With traits the order is not important, and has to be resolved by the<br>
&gt; programmer when a conflict arises:<br>
&gt;<br>
&gt;     struct ErrorAB: A, B {} // An error because there are two `msg`s.<br>
&gt;<br>
&gt; You have to do:<br>
&gt;<br>
&gt;     struct TraitAB: A, B { // Could be B, A - makes no difference<br>
&gt;         let msg = A.msg // Select A&#39;s definition, could be `= B.msg`, could<br>
&gt; be `= 3` (i.e. any valid Swift)<br>
&gt;     }<br>
&gt;<br>
&gt; As an aside I don&#39;t get what you mean by your example:<br>
&gt;<br>
&gt; protocol&lt;A, B&gt;  // error<br>
<br>
This is the spelling for the protocol composition of A and B.<br>
<br>
&gt;<br>
&gt; Protocols cannot be generic!<br>
&gt;<br>
&gt; On Sunday, 28 February 2016, Anton Zhilin via swift-evolution &lt;<br>
&gt; <a href="javascript:;" onclick="_e(event, &#39;cvml&#39;, &#39;swift-evolution@swift.org&#39;)">swift-evolution@swift.org</a>&gt; wrote:<br>
&gt;<br>
&gt;&gt; 0. Please read the whole proposal and this whole message before replying.<br>
&gt;&gt;<br>
&gt;&gt; 1.<br>
&gt;&gt;&gt; In short words, protocol will became a sort of class and no longer a<br>
&gt;&gt; true kind of contract to conform to.<br>
&gt;&gt;<br>
&gt;&gt; There is an option to introduce &quot;mixin&quot; keyword:<br>
&gt;&gt; mixin M {<br>
&gt;&gt; var storage: Int = 0<br>
&gt;&gt; }<br>
&gt;&gt; It won&#39;t cause confusion with today&#39;s protocols.<br>
&gt;&gt; For difference from classes, see under 3.<br>
&gt;&gt;<br>
&gt;&gt; 2.<br>
&gt;&gt;&gt; What about compatibility with Objective C ?<br>
&gt;&gt;<br>
&gt;&gt; Protocols cannot inherit from classes, including NSObject.<br>
&gt;&gt; [Warning: IMO ahead]<br>
&gt;&gt; But I personally think that we should move from abstract classes in Obj-C,<br>
&gt;&gt; where possible. Actually, all classes in Obj-C can be instantiated, so I<br>
&gt;&gt; consider this a bad abstraction.<br>
&gt;&gt;<br>
&gt;&gt; 3.<br>
&gt;&gt;&gt; (see David&#39;s message)<br>
&gt;&gt; Firstly, what you&#39;ve shown is not a diamond problem. No dequate<br>
&gt;&gt; programming language would allow you to do what you&#39;ve shown. Secondly,<br>
&gt;&gt; please read the whole proposal, as I specifically addressed the issue there.<br>
&gt;&gt;<br>
&gt;&gt; Now, to difference from classes.<br>
&gt;&gt; The largest difference between classes and mixins comes in inheritance. We<br>
&gt;&gt; can allow multiple inheritance, because we can solve diamond problem with<br>
&gt;&gt; mixins.<br>
&gt;&gt; Let&#39;s take the example from my proposal:<br>
&gt;&gt;<br>
&gt;&gt; protocol A { var x: Int = 1 }<br>
&gt;&gt; protocol B: A { }<br>
&gt;&gt; protocol C: A { }<br>
&gt;&gt; struct D : B, C { }<br>
&gt;&gt;<br>
&gt;&gt; What really happens here is the following:<br>
&gt;&gt;<br>
&gt;&gt; protocol ASelf { var x: Int = 1 }<br>
&gt;&gt; protocol BSelf { }<br>
&gt;&gt; protocol CSelf { }<br>
&gt;&gt; struct D : ASelf, BSelf, CSelf { }<br>
&gt;&gt;<br>
&gt;&gt; We can do this, because mixins are statically dispatched. The compiler<br>
&gt;&gt; will enumerate all included mixins and mix in only one version of each.<br>
&gt;&gt; I said statically dispatched, but in Swift, compiler can automatically<br>
&gt;&gt; create wrappers with necessary closures inside if we need dynamic dispatch<br>
&gt;&gt; for protocols, so that is not a real concern.<br>
&gt;&gt; Diamond problem is solved the same way in Python and Ruby, so I&#39;m not<br>
&gt;&gt; inventing something new here.<br>
&gt;&gt; Mixins tend to &quot;mix in behaviours&quot;. Let&#39;s take an example usage of diamond<br>
&gt;&gt; pattern:<br>
&gt;&gt;<br>
&gt;&gt; protocol SignalSender {<br>
&gt;&gt; private var slots: [String: [() -&gt; ()]] = []<br>
&gt;&gt; func connect(signal: String, to slot: () -&gt; ()) { ... }<br>
&gt;&gt; func fire(signal: String) { ... }<br>
&gt;&gt; }<br>
&gt;&gt; protocol A : SignalSender {<br>
&gt;&gt; // Use signal functionality<br>
&gt;&gt; }<br>
&gt;&gt; protocol B : SignalSender {<br>
&gt;&gt; // Use signal functionality<br>
&gt;&gt; }<br>
&gt;&gt; struct C : A, B { }<br>
&gt;&gt;<br>
&gt;&gt; A and B both use a single SignalSender, incorporated within final object.<br>
&gt;&gt; If SignalSender supports its invariants through incapsulation, nothing will<br>
&gt;&gt; ever break them. If it doesn&#39;t, then, well, this mixin is not perfectly<br>
&gt;&gt; suited for multiple inheritance.<br>
&gt;&gt;<br>
&gt;&gt; If you have reached this far, thank you!<br>
&gt;&gt; _______________________________________________<br>
&gt;&gt; swift-evolution mailing list<br>
&gt;&gt; <a href="javascript:;" onclick="_e(event, &#39;cvml&#39;, &#39;swift-evolution@swift.org&#39;)">swift-evolution@swift.org</a> &lt;javascript:;&gt;<br>
&gt;&gt; <a href="https://lists.swift.org/mailman/listinfo/swift-evolution" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
&gt;&gt;<br>
&gt;<br>
&gt;<br>
<br>
<br>
<br>
<br>
_______________________________________________<br>
swift-evolution mailing list<br>
<a href="javascript:;" onclick="_e(event, &#39;cvml&#39;, &#39;swift-evolution@swift.org&#39;)">swift-evolution@swift.org</a><br>
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
</blockquote><br><br>-- <br>-- Howard.<br>