<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">2016-07-15 17:21 GMT+03:00 Adrian Zubarev via swift-evolution <span dir="ltr">&lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt;</span>:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><div style="word-wrap:break-word"><div><ul>
<li><p>If it’s possible to drop <code>T.Metatype</code>, sure why not to make it <code>Metatype&lt;T&gt;</code>, but I have no idea hod the core team will build this. We should consider <code>typealias Metatype&lt;T&gt; = T.Metatype</code> as an alternative implementation, but tackle for <code>Metatype&lt;T&gt;</code>.</p></li></ul></div></div></blockquote><div>Nice! </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><div style="word-wrap:break-word"><div><ul>
<li><p>Can you provide a full example?</p></li>
</ul>

<pre><code>let type = Type&lt;Base&gt;(casting: Derived)

// `type` is the same as this, where we know that `Derived` can be `Base`:
let derived = Type&lt;Derived&gt;()
let base = unsafeBitCast(derived, to: Type&lt;Base&gt;)
</code></pre>

<p>The global dictionary contains only the <code>dynamicTypes</code> which were instantiated through <code>Type&lt;T&gt;.sharedInstance</code> or <code>dynamicType(someInstance)</code> function.</p>

<pre><code>let derived: Any = Derived()
let type = dynamicType(derived) // Type&lt;Any&gt;

// I&#39;ll refer to current syntax here
type.metatype is Derived.Type // true
type.metatype is Base.Type // true</code></pre></div></div></blockquote><div>Here you are, full example:<br></div><br><div><font face="monospace, monospace">let x = Type&lt;Derived&gt;()</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">// Type&lt;Derived&gt; is not a subtype of Type&lt;Base&gt;, we must construct a new instance of Type&lt;Base&gt;</font></div><div><font face="monospace, monospace">let y = Type&lt;Base&gt;(casting: </font><span style="font-family:monospace,monospace">x</span><font face="monospace, monospace">)!</font></div><div><font face="monospace, monospace"><br></font></div><div><span style="font-family:monospace,monospace">y === x //=&gt; false</span><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">// Type&lt;T&gt; are reference types. z will point to the same instance as y</font></div><div><font face="monospace, monospace">let z = unsafeBitCast(y, to: Type&lt;Derived&gt;())</font></div></div><div class="gmail_quote"><br><div><font face="monospace, monospace">z === y //=&gt; true</font></div><div><font face="monospace, monospace">z === x //=&gt; false</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">// Static and dynamic types are equal here, so we decide to draw from global dictionary</font></div><div><font face="monospace, monospace">let w = Type&lt;Derived&gt;(casting: y)!</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">w === x //=&gt; true</font></div><div><font face="monospace, monospace">w === y //=&gt; false</font></div><div><font face="monospace, monospace">w === z //=&gt; false</font></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><div style="word-wrap:break-word"><div><pre><span style="font-family:arial,sans-serif">I just realized what causes the SR–2085 bug I mentioned earlier.</span><br></pre>

<ul>
<li><code>Any.Type</code> is not the metatype of <code>Any</code></li>
<li><code>Any.Type</code> means that this ‘thing’ can store any metatype</li>
<li>There is no type that expresses metatype for <code>Any</code></li>
<li>We still can get the metatype for <code>Any</code> through <code>Any.self</code></li>
</ul>

<p>I updated SR–2085 and suggested that we need <code>AnyMetatype</code>.</p></div></div></blockquote><div>Why? I would prefer to be consistent and make <font face="monospace, monospace">Metatype&lt;Any&gt;</font> the metatype of <font face="monospace, monospace">Any</font> (excuse the pun). And <i>because</i> all types are subtypes of <font face="monospace, monospace">Any</font>, instances of <font face="monospace, monospace">Metatype&lt;Any&gt;</font> will still cover all types.</div></div><br></div></div>