Great explanation.<br><br>Can you elaborate on your two reasons for the proposed Type&lt;T&gt;?<br><br>In particular, what do you mean by inheritable and non-inheritable members of T? Where do these come into play? How is the current T.Type deficient in this respect?<br><br>Regarding (2), it is already possible to do precise type matches using `==` instead of `is` (see corelibs-foundation for extensive uses). What does the proposal offer that goes beyond what we currently have?<br><br><br><div class="gmail_quote"><div dir="ltr">On Thu, Sep 29, 2016 at 22:57 Brent Royal-Gordon &lt;<a href="mailto:brent@architechies.com">brent@architechies.com</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 Sep 29, 2016, at 8:14 PM, Xiaodi Wu via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt; wrote:<br>
&gt;<br>
&gt; I&#39;m confused by this explanation.Today, `type(of:)` is the new `.dynamicType`. Is this proposal suggesting a silent change so that it now returns the static type? If so, why (particularly when you explain that this is often *not* what you would want)?<br>
<br>
I&#39;m short-handing the names to talk about the return values. In other words, I assume that, if we have both `type(of:)` and `subtype(of:)`, their signatures would be:<br>
<br>
        func type&lt;T&gt;(of: T) -&gt; Type&lt;T&gt;<br>
        func subtype&lt;T&gt;(of: T) -&gt; Subtype&lt;T&gt;<br>
<br>
And I&#39;m saying that, given these names, `type(of:)` is confusing and near-useless, whereas `subtype(of:)` is what you almost always want.<br>
<br>
We *could*, of course, have a function called `type(of:)` which returned `Subtype&lt;T&gt;` and had the semantics I&#39;m referring to as `subtype(of:)`. A name is just a name.<br>
<br>
&gt; I&#39;m also somewhat puzzled about the proposed design. This proposal explains that Subtype&lt;T&gt; should be a supertype of Type&lt;T&gt; and its subtypes. Why is a supertype named Subtype?<br>
<br>
Because a type&#39;s name should describe the *instances*; that&#39;s why you don&#39;t put &quot;Class&quot; at the end of all of your class names. (It&#39;s also why we&#39;re proposing `Type&lt;T&gt;` instead of `Metatype&lt;T&gt;`.)<br>
<br>
Every instance of `Subtype&lt;T&gt;` is the type instance for a subtype of `T`. For instance, in this hierarchy:<br>
<br>
        NSObject<br>
        NSResponder: NSObject<br>
        NSView: NSResponder<br>
<br>
`Type&lt;NSResponder&gt;` is a `Subtype&lt;NSObject&gt;`, but not a `Subtype&lt;NSView&gt;`.<br>
<br>
Thus, this reads correctly:<br>
<br>
        let aType: Subtype&lt;NSResponder&gt; = NSView.self<br>
<br>
Whereas this does not:<br>
<br>
        let aType: Supertype&lt;NSResponder&gt; = NSView.self<br>
<br>
--<br>
Brent Royal-Gordon<br>
Architechies<br>
<br>
</blockquote></div>