<div dir="ltr"><div class="markdown-here-wrapper" style=""><p style="margin:0px 0px 1.2em!important">I suggested it because now we can’t call any initializers on <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);border-radius:3px;display:inline;background-color:rgb(248,248,248)">Type&lt;T&gt;</code>. If we add <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);border-radius:3px;display:inline;background-color:rgb(248,248,248)">_Type&lt;T&gt;</code>, we can add public initializers and keep <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);border-radius:3px;display:inline;background-color:rgb(248,248,248)">Type&lt;T&gt;</code> instances unique.</p>
<pre style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;font-size:1em;line-height:1.2em;margin:1.2em 0px"><code class="hljs language-swift" style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);border-radius:3px;display:inline;background-color:rgb(248,248,248);white-space:pre;overflow:auto;border-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em 0.7em;display:block!important;display:block;overflow-x:auto;padding:0.5em;color:rgb(51,51,51);background:rgb(248,248,248)"><span class="hljs-comment" style="color:rgb(153,153,136);font-style:italic">// No uniqueness guarantee</span>
internal final <span class="hljs-class"><span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">class</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold;color:rgb(68,85,136);font-weight:bold">_Type</span>&lt;<span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold;color:rgb(68,85,136);font-weight:bold">T</span>&gt; </span>{
    <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">var</span> _metatype: <span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">Metatype</span>&lt;<span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">T</span>&gt;

    <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">init</span>()
    <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">init</span>(<span class="hljs-number" style="color:rgb(0,128,128)">_</span>: <span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">AnyMetatype</span>)
    <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">init</span>?&lt;<span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">U</span>&gt;(casting: <span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">Type</span>&lt;<span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">U</span>&gt;)
}

internal <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">var</span> _typeStorage = <span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">Set</span>&lt;_Type&lt;<span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">Any</span>&gt;&gt;()

<span class="hljs-comment" style="color:rgb(153,153,136);font-style:italic">// Uniqueness guarantee</span>
<span class="hljs-comment" style="color:rgb(153,153,136);font-style:italic">// &#39;final class&#39; is an implementation detail</span>
public <span class="hljs-class"><span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">struct</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold;color:rgb(68,85,136);font-weight:bold">Type</span>&lt;<span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold;color:rgb(68,85,136);font-weight:bold">T</span>&gt; </span>{
    internal <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">var</span> _impl: _Type&lt;<span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">T</span>&gt;

    <span class="hljs-comment" style="color:rgb(153,153,136);font-style:italic">// Notice &#39;public&#39;</span>
    public <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">init</span>()
    public <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">init</span>(<span class="hljs-number" style="color:rgb(0,128,128)">_</span>: <span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">AnyMetatype</span>)
    public <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">init</span>?&lt;<span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">U</span>&gt;(casting: <span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">Type</span>&lt;<span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">U</span>&gt;)
}
</code></pre>
<p style="margin:0px 0px 1.2em!important">There will be no <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);border-radius:3px;display:inline;background-color:rgb(248,248,248)">===</code> operator for <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);border-radius:3px;display:inline;background-color:rgb(248,248,248)">Type&lt;T&gt;</code>, because it does not add value. <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);border-radius:3px;display:inline;background-color:rgb(248,248,248)">Type&lt;T&gt;</code> is a wrapper of typeless identifier with value semantics. It is singleton pattern that makes us use classes.</p>
<div title="MDH:PGRpdiBjbGFzcz0iZ21haWxfZXh0cmEiPkkgc3VnZ2VzdGVkIGl0IGJlY2F1c2Ugbm93IHdlIGNh
bid0IGNhbGwgYW55IGluaXRpYWxpemVycyBvbiBgVHlwZSZsdDtUJmd0O2AuIElmIHdlIGFkZCBg
X1R5cGUmbHQ7VCZndDtgLCB3ZSBjYW4gYWRkIHB1YmxpYyBpbml0aWFsaXplcnMgYW5kIGtlZXAg
YFR5cGUmbHQ7VCZndDtgIGluc3RhbmNlcyB1bmlxdWUuPC9kaXY+PGRpdiBjbGFzcz0iZ21haWxf
ZXh0cmEiPjxicj48L2Rpdj48ZGl2IGNsYXNzPSJnbWFpbF9leHRyYSI+YGBgc3dpZnQ8L2Rpdj48
ZGl2IGNsYXNzPSJnbWFpbF9leHRyYSI+PGRpdiBjbGFzcz0iZ21haWxfZXh0cmEiPi8vIE5vIHVu
aXF1ZW5lc3MgZ3VhcmFudGVlPC9kaXY+PGRpdiBjbGFzcz0iZ21haWxfZXh0cmEiPmludGVybmFs
IGZpbmFsIGNsYXNzIF9UeXBlJmx0O1QmZ3Q7IHs8L2Rpdj48ZGl2IGNsYXNzPSJnbWFpbF9leHRy
YSI+Jm5ic3A7ICZuYnNwOyB2YXIgX21ldGF0eXBlOiBNZXRhdHlwZSZsdDtUJmd0OzwvZGl2Pjxk
aXYgY2xhc3M9ImdtYWlsX2V4dHJhIj48YnI+PC9kaXY+PGRpdiBjbGFzcz0iZ21haWxfZXh0cmEi
PiZuYnNwOyAmbmJzcDsgaW5pdCgpPC9kaXY+PGRpdiBjbGFzcz0iZ21haWxfZXh0cmEiPiZuYnNw
OyAmbmJzcDsgaW5pdChfOiBBbnlNZXRhdHlwZSk8L2Rpdj48ZGl2IGNsYXNzPSJnbWFpbF9leHRy
YSI+Jm5ic3A7ICZuYnNwOyBpbml0PyZsdDtVJmd0OyhjYXN0aW5nOiBUeXBlJmx0O1UmZ3Q7KTwv
ZGl2PjxkaXYgY2xhc3M9ImdtYWlsX2V4dHJhIj59PC9kaXY+PGRpdiBjbGFzcz0iZ21haWxfZXh0
cmEiPjxicj48L2Rpdj48ZGl2IGNsYXNzPSJnbWFpbF9leHRyYSI+aW50ZXJuYWwgdmFyIF90eXBl
U3RvcmFnZSA9IFNldCZsdDtfVHlwZSZsdDtBbnkmZ3Q7Jmd0OygpPC9kaXY+PGRpdiBjbGFzcz0i
Z21haWxfZXh0cmEiPjxicj48L2Rpdj48ZGl2IGNsYXNzPSJnbWFpbF9leHRyYSI+Ly8gVW5pcXVl
bmVzcyBndWFyYW50ZWU8L2Rpdj48ZGl2IGNsYXNzPSJnbWFpbF9leHRyYSI+Ly8gJ2ZpbmFsIGNs
YXNzJyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWw8L2Rpdj48ZGl2IGNsYXNzPSJnbWFpbF9l
eHRyYSI+cHVibGljIHN0cnVjdCBUeXBlJmx0O1QmZ3Q7IHs8L2Rpdj48ZGl2IGNsYXNzPSJnbWFp
bF9leHRyYSI+Jm5ic3A7ICZuYnNwOyBpbnRlcm5hbCB2YXIgX2ltcGw6IF9UeXBlJmx0O1QmZ3Q7
PC9kaXY+PGRpdiBjbGFzcz0iZ21haWxfZXh0cmEiPjxicj48L2Rpdj48ZGl2IGNsYXNzPSJnbWFp
bF9leHRyYSI+Jm5ic3A7ICZuYnNwOyAvLyBOb3RpY2UgJ3B1YmxpYyc8L2Rpdj48ZGl2IGNsYXNz
PSJnbWFpbF9leHRyYSI+Jm5ic3A7ICZuYnNwOyBwdWJsaWMgaW5pdCgpPC9kaXY+PGRpdiBjbGFz
cz0iZ21haWxfZXh0cmEiPiZuYnNwOyAmbmJzcDsgcHVibGljIGluaXQoXzogQW55TWV0YXR5cGUp
PC9kaXY+PGRpdiBjbGFzcz0iZ21haWxfZXh0cmEiPiZuYnNwOyAmbmJzcDsgcHVibGljIGluaXQ/
Jmx0O1UmZ3Q7KGNhc3Rpbmc6IFR5cGUmbHQ7VSZndDspPC9kaXY+PGRpdiBjbGFzcz0iZ21haWxf
ZXh0cmEiPn08L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPSJnbWFpbF9leHRyYSI+YGBgPC9kaXY+PGRp
diBjbGFzcz0iZ21haWxfZXh0cmEiPjxicj48L2Rpdj48ZGl2IGNsYXNzPSJnbWFpbF9leHRyYSI+
VGhlcmUgd2lsbCBiZSBubyBgPT09YCBvcGVyYXRvciBmb3IgYFR5cGUmbHQ7VCZndDtgLCBiZWNh
dXNlIGl0IGRvZXMgbm90IGFkZCB2YWx1ZS4gYFR5cGUmbHQ7VCZndDtgIGlzIGEgd3JhcHBlciBv
ZiB0eXBlbGVzcyBpZGVudGlmaWVyIHdpdGggdmFsdWUgc2VtYW50aWNzLiBJdCBpcyBzaW5nbGV0
b24gcGF0dGVybiB0aGF0IG1ha2VzIHVzIHVzZSBjbGFzc2VzLjwvZGl2Pg==" style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0">​</div></div></div>