<div dir="ltr"><i>For what it&#39;s worth, I believe the pull request Anton mentioned above (&lt;<a href="https://github.com/apple/swift-evolution/pull/553" rel="noreferrer" class="gmail_msg" target="_blank">https://github.com/apple/swift-evolution/pull/553</a>&gt;) addresses this.</i><br><div><br></div><div><br></div><div>And this proposal is suggesting moving away from the pattern/practice, rather than diving deeper into it. They are, therefore, (unintentionally) antagonistic.</div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr">On Sun, 4 Dec 2016 at 21:56 Brent Royal-Gordon via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">&gt; On Dec 1, 2016, at 2:09 PM, Dave Abrahams via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="gmail_msg" target="_blank">swift-evolution@swift.org</a>&gt; wrote:<br class="gmail_msg">
&gt;<br class="gmail_msg">
&gt; More<br class="gmail_msg">
&gt; importantly, they suggest that the metatype argument will be used in<br class="gmail_msg">
&gt; some dynamic way (e.g. by calling a static method or an init), instead<br class="gmail_msg">
&gt; of just as a way to get the right type inference.  In some cases that<br class="gmail_msg">
&gt; can make a dramatic difference in the resulting semantics.<br class="gmail_msg">
&gt;<br class="gmail_msg">
&gt;    func polymorphicSomething&lt;T&gt;(_: T.Type) {<br class="gmail_msg">
&gt;      ...<br class="gmail_msg">
&gt;    }<br class="gmail_msg">
&gt;<br class="gmail_msg">
&gt;    class Base {}<br class="gmail_msg">
&gt;    class Derived : Base {}<br class="gmail_msg">
&gt;<br class="gmail_msg">
&gt;    func otherThing(x: Base) {<br class="gmail_msg">
&gt;      // Surprise! I&#39;m going to ignore the dynamic type you gave me and<br class="gmail_msg">
&gt;      // just use Base<br class="gmail_msg">
&gt;      polymorphicSomething(type(of: y))<br class="gmail_msg">
&gt;    }<br class="gmail_msg">
&gt;<br class="gmail_msg">
&gt;    otherThing(Derived())<br class="gmail_msg">
<br class="gmail_msg">
For what it&#39;s worth, I believe the pull request Anton mentioned above (&lt;<a href="https://github.com/apple/swift-evolution/pull/553" rel="noreferrer" class="gmail_msg" target="_blank">https://github.com/apple/swift-evolution/pull/553</a>&gt;) addresses this. It provides both `Type&lt;T&gt;`, which means *exactly* T, and `AnyType&lt;T&gt;`, which means *any subtype of* `T`. You&#39;d use `Type&lt;T&gt;` for type-pinning parameters and `AnyType&lt;T&gt;` for dynamically-typed parameters.<br class="gmail_msg">
<br class="gmail_msg">
(`AnyType&lt;T&gt;` is a protocol-like type which all `Type&lt;_&gt;`s for subtypes of `T` &quot;conform&quot; to. Thus, you can pass a `Type&lt;T&gt;` as an `AnyType&lt;T&gt;`, but not vice versa.)<br class="gmail_msg">
<br class="gmail_msg">
In other words, if `polymorphicSomething` were declared like:<br class="gmail_msg">
<br class="gmail_msg">
   func polymorphicSomething&lt;T&gt;(_: AnyType&lt;T&gt;) {<br class="gmail_msg">
     ...<br class="gmail_msg">
   }<br class="gmail_msg">
<br class="gmail_msg">
Then you would expect it to use the specific subtype you provided. But if you said:<br class="gmail_msg">
<br class="gmail_msg">
   func polymorphicSomething&lt;T&gt;(_: Type&lt;T&gt;) {<br class="gmail_msg">
     ...<br class="gmail_msg">
   }<br class="gmail_msg">
<br class="gmail_msg">
Then it would be clear in the signature that it was using only the static type of `T`, not the dynamic type. (It&#39;d be clear because `Type&lt;T&gt;` can only contain `T`&#39;s type instance, not subtypes&#39; type instances.) Since `type(of:)` would return an `AnyType&lt;Base&gt;`, this line:<br class="gmail_msg">
<br class="gmail_msg">
     polymorphicSomething(type(of: y))<br class="gmail_msg">
<br class="gmail_msg">
Would be trying to pass `AnyType&lt;Base&gt;` to a `Type&lt;_&gt;` parameter, which would not fly. Thus, it would fail at compile time.<br class="gmail_msg">
<br class="gmail_msg">
--<br class="gmail_msg">
Brent Royal-Gordon<br class="gmail_msg">
Architechies<br class="gmail_msg">
<br class="gmail_msg">
_______________________________________________<br class="gmail_msg">
swift-evolution mailing list<br class="gmail_msg">
<a href="mailto:swift-evolution@swift.org" class="gmail_msg" target="_blank">swift-evolution@swift.org</a><br class="gmail_msg">
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" class="gmail_msg" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br class="gmail_msg">
</blockquote></div>