<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><br class=""><div><blockquote type="cite" class=""><div class="">On 10 Nov 2016, at 16:53, Jay Abbott &lt;<a href="mailto:jay@abbott.me.uk" class="">jay@abbott.me.uk</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class=""><div class="markdown-here-wrapper" style=""><p style="margin:0px 0px 1.2em!important" class="">Haravikk,</p><p style="margin:0px 0px 1.2em!important" class="">I think you missed ilya’s point with the owner/pet example:</p>
<pre style="font-size:1em;font-family:Consolas,Inconsolata,Courier,monospace;font-size:1em;line-height:1.2em;margin:1.2em 0px" class=""><code class="language-swift hljs" 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">// This is inside the Owner class...</span>
<span class="hljs-func"><span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">func</span> <span class="hljs-title" style="color:rgb(153,0,0);font-weight:bold">freeMyPetIfIHaveOne</span> </span>{
  <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">if</span> pet != <span class="hljs-built_in" style="color:rgb(0,134,179)">nil</span> {
    pet.setFree() <span class="hljs-comment" style="color:rgb(153,153,136);font-style:italic">// this sets pet = nil</span>
    <span class="hljs-comment" style="color:rgb(153,153,136);font-style:italic">// self.pet is now nil - not due to concurrency, it was set to nil on this thread in the function above.</span>
    <span class="hljs-comment" style="color:rgb(153,153,136);font-style:italic">// However, the compiler considers it a non-optional at this point</span>
    pet.doStuff() <span class="hljs-comment" style="color:rgb(153,153,136);font-style:italic">// Compiler allows, bad things happen!</span>
  }
}
</code></pre><p style="margin:0px 0px 1.2em!important" class="">As Dennis mentioned, narrowing only works for immutable values, and since optionals are always mutable it defeats the whole justification for it. I like the concept, but maybe it should be for immutables only?</p></div></div></div></blockquote><div>If pet is of type Optional&lt;T&gt; then a .setFree() method on T cannot set self = nil, as self is of type T only in that scope.</div><div><br class=""></div><div>The only way you can do something like that is to declare the setFree() method on Optional where Element:T, but that won't work on the updated proposal which uses a keyword to explicitly unwrap the variable (to avoid precisely that kind of Optional&lt;T&gt; vs T method conflict), you can view the updated proposals here:</div><div><br class=""></div><div><a href="https://github.com/Haravikk/swift-evolution/blob/master/proposals/NNNN-optional-unwrapping.md" class="">https://github.com/Haravikk/swift-evolution/blob/master/proposals/NNNN-optional-unwrapping.md</a><br class=""><a href="https://github.com/Haravikk/swift-evolution/blob/master/proposals/NNNN-type-narrowing.md" class="">https://github.com/Haravikk/swift-evolution/blob/master/proposals/NNNN-type-narrowing.md</a></div><div><br class=""></div><div>I've also checked and a similar case like this for polymorphic types shouldn't be an issue either, as you can't assign self to a wider (or even orthogonal) type.</div><div><br class=""></div><div>In other words, the only way that .setFree() can make changes that would break narrowing would be to have a reference to the instance you're working with, which is what the proposals now guard against. But for value types this should not be an issue at all.</div><div><br class=""></div><div>This is all of course unless I'm missing something else, but I tried in a playground and I can't assign anything to self that would break narrowing/unwrapping that I can see, except through a reference type.</div></div></body></html>