<div dir="ltr"><div class="markdown-here-wrapper" style=""><p style="margin:0px 0px 1.2em!important"></p><div class="markdown-here-exclude"><p></p><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word" class="gmail_msg"><div class="gmail_msg"><pre style="box-sizing:border-box;font-family:Consolas,&#39;Liberation Mono&#39;,Menlo,Courier,monospace;font-size:13.600000381469727px;margin-top:0px;margin-bottom:16px;line-height:1.45;word-wrap:normal;padding:16px;overflow:auto;background-color:rgb(247,247,247);border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;color:rgb(51,51,51)" class="gmail_msg"><code style="box-sizing:border-box;font-family:Consolas,&#39;Liberation Mono&#39;,Menlo,Courier,monospace;padding:0px;margin:0px;background-color:transparent;border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;word-break:normal;border:0px;display:inline;overflow:visible;line-height:inherit;word-wrap:normal" class="gmail_msg">@unwrappable(type: Int)
public enum Count {
    case none // not unwrappable
    case many // not unwrappable
    case some(Int)
    case owed(Int)
    case something(String) // not unwrappable
    case multiple(Int, Int) // not unwrappable
}
</code></pre></div>
</div></blockquote><p></p></div><p style="margin:0px 0px 1.2em!important"></p>
<p style="margin:0px 0px 1.2em!important">Instead of requiring the <code style="font-size:1em;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);background-color:rgb(248,248,248);border-radius:3px;display:inline">@unwrappable</code> attribute, why not have <code style="font-size:1em;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);background-color:rgb(248,248,248);border-radius:3px;display:inline">unwrap</code> work normally when the type can be inferred, or require hints when it can’t:</p>
<pre style="font-size:1em;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:1em;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);background-color:rgb(248,248,248);border-radius:3px;display:inline;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) none repeat scroll 0% 0%"><span class="hljs-comment" style="color:rgb(153,153,136);font-style:italic">// For an optional (or any other enum with only one wrapped type)</span>
guard unwrap x <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">else</span> { <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">return</span> }
<span class="hljs-comment" style="color:rgb(153,153,136);font-style:italic">// For an enum of type Count as defined above</span>
guard unwrap myCount <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">else</span> { <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">return</span> } <span class="hljs-comment" style="color:rgb(153,153,136);font-style:italic">// compiler error - type can&#39;t be determined</span>
guard unwrap(myCount: <span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">Int</span>) <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">else</span> { <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">return</span> } <span class="hljs-comment" style="color:rgb(153,153,136);font-style:italic">// Success for &#39;some&#39; or &#39;owed&#39; (implicit shadowing)</span>
guard unwrap(<span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">let</span> someOrOwed: <span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">Int</span>) myCount <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">else</span> { <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">return</span> } <span class="hljs-comment" style="color:rgb(153,153,136);font-style:italic">// Success for &#39;some&#39; or &#39;owed&#39; (no shadowing)</span>
guard unwrap(<span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">let</span> x: <span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">Int</span>, <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">let</span> y: <span class="hljs-type" style="color:rgb(68,85,136);font-weight:bold">Int</span>) myCount <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">else</span> { <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">return</span> } <span class="hljs-comment" style="color:rgb(153,153,136);font-style:italic">// Success for &#39;multiple&#39; (no shadowing)</span>
</code></pre>
<p style="margin:0px 0px 1.2em!important">Notes:</p>
<ul style="margin:1.2em 0px;padding-left:2em">
<li style="margin:0.5em 0px"><code style="font-size:1em;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);background-color:rgb(248,248,248);border-radius:3px;display:inline">unwrap x</code> is equivalent to <code style="font-size:1em;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);background-color:rgb(248,248,248);border-radius:3px;display:inline">unwrap(x: T)</code> where there is a single unambiguous type.</li>
<li style="margin:0.5em 0px">The <code style="font-size:1em;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);background-color:rgb(248,248,248);border-radius:3px;display:inline">let</code> keyword probably could be implicit for the non-shadowing forms, like it is for the shadowing form, but makes it clear what’s going on.</li>
<li style="margin:0.5em 0px">unwrap fails for <code style="font-size:1em;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);background-color:rgb(248,248,248);border-radius:3px;display:inline">none</code> or <code style="font-size:1em;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);background-color:rgb(248,248,248);border-radius:3px;display:inline">many</code> from the <code style="font-size:1em;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);background-color:rgb(248,248,248);border-radius:3px;display:inline">Count</code> type, just as it does for <code style="font-size:1em;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);background-color:rgb(248,248,248);border-radius:3px;display:inline">none</code> from Optional</li>
<li style="margin:0.5em 0px">I <em>think</em> that this assumes Swift is not allowed to try to infer the most restrictive type for reference types. Haven’t really thought about this much.</li>
</ul>
<div title="MDH:PGNvZGUgc3R5bGU9ImJveC1zaXppbmc6Ym9yZGVyLWJveDtmb250LWZhbWlseTpDb25zb2xhcywn
TGliZXJhdGlvbiBNb25vJyxNZW5sbyxDb3VyaWVyLG1vbm9zcGFjZTtwYWRkaW5nOjBweDttYXJn
aW46MHB4O2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1
czozcHg7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXM6M3B4O2JvcmRlci1ib3R0b20tcmlnaHQtcmFk
aXVzOjNweDtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOjNweDt3b3JkLWJyZWFrOm5vcm1hbDti
b3JkZXI6MHB4O2Rpc3BsYXk6aW5saW5lO292ZXJmbG93OnZpc2libGU7bGluZS1oZWlnaHQ6aW5o
ZXJpdDt3b3JkLXdyYXA6bm9ybWFsIiBjbGFzcz0iZ21haWxfbXNnIj48L2NvZGU+PGRpdiBjbGFz
cz0iZ21haWxfcXVvdGUiPjxibG9ja3F1b3RlIGNsYXNzPSJnbWFpbF9xdW90ZSIgc3R5bGU9Im1h
cmdpbjowIDAgMCAuOGV4O2JvcmRlci1sZWZ0OjFweCAjY2NjIHNvbGlkO3BhZGRpbmctbGVmdDox
ZXg7Ij48ZGl2IHN0eWxlPSJ3b3JkLXdyYXA6YnJlYWstd29yZCIgY2xhc3M9ImdtYWlsX21zZyI+
PGRpdiBjbGFzcz0iZ21haWxfbXNnIj48cHJlIHN0eWxlPSJib3gtc2l6aW5nOmJvcmRlci1ib3g7
Zm9udC1mYW1pbHk6Q29uc29sYXMsJ0xpYmVyYXRpb24gTW9ubycsTWVubG8sQ291cmllcixtb25v
c3BhY2U7Zm9udC1zaXplOjEzLjYwMDAwMDM4MTQ2OTcyN3B4O21hcmdpbi10b3A6MHB4O21hcmdp
bi1ib3R0b206MTZweDtsaW5lLWhlaWdodDoxLjQ1O3dvcmQtd3JhcDpub3JtYWw7cGFkZGluZzox
NnB4O292ZXJmbG93OmF1dG87YmFja2dyb3VuZC1jb2xvcjpyZ2IoMjQ3LDI0NywyNDcpO2JvcmRl
ci10b3AtbGVmdC1yYWRpdXM6M3B4O2JvcmRlci10b3AtcmlnaHQtcmFkaXVzOjNweDtib3JkZXIt
Ym90dG9tLXJpZ2h0LXJhZGl1czozcHg7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czozcHg7Y29s
b3I6cmdiKDUxLDUxLDUxKSIgY2xhc3M9ImdtYWlsX21zZyI+PGNvZGUgc3R5bGU9ImJveC1zaXpp
bmc6Ym9yZGVyLWJveDtmb250LWZhbWlseTpDb25zb2xhcywnTGliZXJhdGlvbiBNb25vJyxNZW5s
byxDb3VyaWVyLG1vbm9zcGFjZTtwYWRkaW5nOjBweDttYXJnaW46MHB4O2JhY2tncm91bmQtY29s
b3I6dHJhbnNwYXJlbnQ7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1czozcHg7Ym9yZGVyLXRvcC1yaWdo
dC1yYWRpdXM6M3B4O2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjNweDtib3JkZXItYm90dG9t
LWxlZnQtcmFkaXVzOjNweDt3b3JkLWJyZWFrOm5vcm1hbDtib3JkZXI6MHB4O2Rpc3BsYXk6aW5s
aW5lO292ZXJmbG93OnZpc2libGU7bGluZS1oZWlnaHQ6aW5oZXJpdDt3b3JkLXdyYXA6bm9ybWFs
IiBjbGFzcz0iZ21haWxfbXNnIj5AdW53cmFwcGFibGUodHlwZTogSW50KQpwdWJsaWMgZW51bSBD
b3VudCB7CiAgICBjYXNlIG5vbmUgLy8gbm90IHVud3JhcHBhYmxlCiAgICBjYXNlIG1hbnkgLy8g
bm90IHVud3JhcHBhYmxlCiAgICBjYXNlIHNvbWUoSW50KQogICAgY2FzZSBvd2VkKEludCkKICAg
IGNhc2Ugc29tZXRoaW5nKFN0cmluZykgLy8gbm90IHVud3JhcHBhYmxlCiAgICBjYXNlIG11bHRp
cGxlKEludCwgSW50KSAvLyBub3QgdW53cmFwcGFibGUKfQo8L2NvZGU+PC9wcmU+PC9kaXY+Cjwv
ZGl2PjwvYmxvY2txdW90ZT48ZGl2Pkluc3RlYWQgb2YgcmVxdWlyaW5nIHRoZSBgQHVud3JhcHBh
YmxlYCBhdHRyaWJ1dGUsIHdoeSBub3QgaGF2ZSBgdW53cmFwYCB3b3JrIG5vcm1hbGx5IHdoZW4g
dGhlIHR5cGUgY2FuIGJlIGluZmVycmVkLCBvciByZXF1aXJlIGhpbnRzIHdoZW4gaXQgY2FuJ3Q6
PGJyPjxicj48L2Rpdj48ZGl2PmBgYHN3aWZ0PGJyPjwvZGl2PjxkaXY+Ly8gRm9yIGFuIG9wdGlv
bmFsIChvciBhbnkgb3RoZXIgZW51bSB3aXRoIG9ubHkgb25lIHdyYXBwZWQgdHlwZSk8YnI+PC9k
aXY+PGRpdj5ndWFyZCB1bndyYXAgeCBlbHNlIHsgcmV0dXJuIH08YnI+PC9kaXY+PGRpdj4vLyBG
b3IgYW4gZW51bSBvZiB0eXBlIENvdW50IGFzIGRlZmluZWQgYWJvdmU8YnI+PC9kaXY+PGRpdj5n
dWFyZCB1bndyYXAgbXlDb3VudCBlbHNlIHsgcmV0dXJuIH0gLy8gY29tcGlsZXIgZXJyb3IgLSB0
eXBlIGNhbid0IGJlIGRldGVybWluZWQ8YnI+PC9kaXY+PGRpdj5ndWFyZCB1bndyYXAobXlDb3Vu
dDogSW50KSBlbHNlIHsgcmV0dXJuIH0gLy8gU3VjY2VzcyBmb3IgJ3NvbWUnIG9yICdvd2VkJyAo
aW1wbGljaXQgc2hhZG93aW5nKTxicj48L2Rpdj48ZGl2PjxkaXY+Z3VhcmQgdW53cmFwKGxldCBz
b21lT3JPd2VkOiBJbnQpIG15Q291bnQgZWxzZSB7IHJldHVybiB9IC8vIFN1Y2Nlc3MgZm9yICdz
b21lJyBvciAnb3dlZCcgKG5vIHNoYWRvd2luZyk8YnI+PC9kaXY+PGRpdj5ndWFyZCB1bndyYXAo
bGV0IHg6IEludCwgbGV0IHk6IEludCkgbXlDb3VudCBlbHNlIHsgcmV0dXJuIH0gLy8gU3VjY2Vz
cyBmb3IgJ211bHRpcGxlJyAobm8gc2hhZG93aW5nKTxicj48L2Rpdj5gYGA8YnI+PGJyPjwvZGl2
PjxkaXY+Tm90ZXM6PGJyPjwvZGl2PjxkaXY+KiBgdW53cmFwIHhgIGlzIGVxdWl2YWxlbnQgdG8g
YHVud3JhcCh4OiBUKWAgd2hlcmUgdGhlcmUgaXMgYSBzaW5nbGUgdW5hbWJpZ3VvdXMgdHlwZS48
YnI+PC9kaXY+PGRpdj4qIFRoZSBgbGV0YCBrZXl3b3JkIHByb2JhYmx5IGNvdWxkIGJlIGltcGxp
Y2l0IGZvciB0aGUgbm9uLXNoYWRvd2luZyBmb3JtcywgbGlrZSBpdCBpcyBmb3IgdGhlIHNoYWRv
d2luZyBmb3JtLCBidXQgbWFrZXMgaXQgY2xlYXIgd2hhdCdzIGdvaW5nIG9uLjxicj48L2Rpdj48
ZGl2PiogdW53cmFwIGZhaWxzIGZvciBgbm9uZWAgb3IgYG1hbnlgIGZyb20gdGhlIGBDb3VudGAg
dHlwZSwganVzdCBhcyBpdCBkb2VzIGZvciBgbm9uZWAgZnJvbSBPcHRpb25hbDxicj48L2Rpdj48
ZGl2PiogSSAqdGhpbmsqIHRoYXQgdGhpcyBhc3N1bWVzIFN3aWZ0IGlzIG5vdCBhbGxvd2VkIHRv
IHRyeSB0byBpbmZlciB0aGUgbW9zdCByZXN0cmljdGl2ZSB0eXBlIGZvciByZWZlcmVuY2UgdHlw
ZXMuIEhhdmVuJ3QgcmVhbGx5IHRob3VnaHQgYWJvdXQgdGhpcyBtdWNoLjxicj48YnI+PC9kaXY+
PC9kaXY+" style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0">​</div></div></div>