<div dir="ltr"><div>On Sun, Sep 25, 2016 at 4:19 PM, Trans via swift-evolution <span dir="ltr">&lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt;</span> wrote:<br></div><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">As I&#39;ve been learning Swift recently, one aspect of the language<br>
jumped out at me with a &quot;code smell&quot;. Namely, the way Optionals are<br>
handled. For starters, just consider how long this chapter is:<br>
<a href="https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/OptionalChaining.html" rel="noreferrer" target="_blank">https://developer.apple.com/<wbr>library/content/documentation/<wbr>Swift/Conceptual/Swift_<wbr>Programming_Language/<wbr>OptionalChaining.html</a><br>
That&#39;s pretty beefy for something on the surface is pretty simple.<br>
<br></blockquote><div><br></div><div>Handling &#39;nothing&#39; is actually complicated. I am not sure that there is a reasonable way to make it less complicated. There are quite a few tools to deal with &quot;this might not contain anything&quot; and yes, that can be daunting, but each tool pulls its weight. <br></div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
More concretely, consider the example given:<br>
<br>
    class Person {<br>
        var residence: Residence?<br>
    }<br>
<br>
    class Residence {<br>
        var numberOfRooms = 1<br>
    }<br>
<br>
    let john = Person()<br>
<br>
    let roomCount = john.residence.numberOfRooms<br>
<br>
    // error: value of optional type &#39;Residence?&#39; not unwrapped; did<br>
you mean to use &#39;!&#39; or &#39;?&#39;?<br>
<br>
As general rule of thumb, whenever I get an error and the system tells<br>
me what I probably meant, that is a pretty good sign the system isn&#39;t<br>
doing all it can for me and making me jump through an unnecessary<br>
hoop.<br></blockquote><div><br></div><div>If you click the fixit, the compiler will insert a `!` for you. If you typed that using autocomplete, it would have put a `?` in for you. I don&#39;t see understand what else it can do for you. A choice has to be made about how to handle &quot;The left portion of this might be nil&quot; and an implicit choice is bad. </div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<br>
Basically &quot;john.residence.numberOfRooms&quot; is a completely wasted<br>
expression -- it&#39;s meaningless. You have to put a `?` or `!` in there<br>
to get anything useful. I can&#39;t see any good reason for that.<br>
&quot;john.residence.numberOfRooms&quot; could just behave one way or the other,<br>
either as if the `?` were there, or the `!`. And of the two, the<br>
obvious choice is `?` because... I already told the program it the was<br>
optional in &quot;var residence: Residence?&quot;.  I said it was optional, and<br>
yep I meant that. (Reminds me of the old retort &quot;did I stutter?&quot;)<br></blockquote><div><br></div><div>You meant &#39;this might be nil&#39;. You did not say what to do when it is and you usually cannot always say if finding nothing is recoverable even for the same property.</div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
Thus, if I try to assign it to something else it too should be<br>
optional. If I want it to be otherwise I&#39;d add the `!`.<br></blockquote><div>This seems like a step backward. `?` calls out everyplace that there is uncertainty about `nothing`. Going back to hidden nil messaging isn&#39;t a good move. I know what it feels like to unexpectedly message nil. I can debug it just fine. I know that the skill can be acquired and yet, I think that swift is better for not requiring that skill of new programmers. </div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<br>
Making this change would just simplify a whole mess of code and about<br>
half that chapter would all but vanish.<br></blockquote><div><br></div><div>It would not simplify the code at all. It would complicate reading it. </div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<br>
In addition, seeing that `!` acts a short-circuit to error, it would<br>
be nice to have something equivalent for fallback value. We can&#39;t use<br>
`??` b/c it doesn&#39;t chain, though maybe it could be made to? And I&#39;d<br>
rather not reuse `?.` here  (for reasons I can explain later). Maybe<br>
`:` is a good choice? In any case, exact syntax aside,<br>
<br>
    let homelessShelter = Residence()<br>
    let roomCount = john.residence:<wbr>homelessShelter.numberOfRooms<br>
<br>
Now, roomCount will not be optional, because there is a guaranteed value.<br>
<br>
I think simplifying Optionals this way would be a good fit for Swift,<br>
making this part of the language a whole lot cleaner and clearer.<br></blockquote><div><br></div><div><br></div><div>I disagree, as the rest of my reply has likely indicated. Some things a fine being implicit (the positive sign on integers, for instance). Optionality is not one of those things.</div><div><br></div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
______________________________<wbr>_________________<br>
swift-evolution mailing list<br>
<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br>
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/<wbr>mailman/listinfo/swift-<wbr>evolution</a><br>
</blockquote></div><br></div></div>