As I've been learning Swift recently, one aspect of the language
jumped out at me with a "code smell". Namely, the way Optionals are
handled. For starters, just consider how long this chapter is:
https://developer.apple.com/library/content/documentation/
Swift/Conceptual/Swift_Programming_Language/OptionalChaining.html
That's pretty beefy for something on the surface is pretty simple.
Handling 'nothing' 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 "this might not contain anything" and yes, that can be daunting,
but each tool pulls its weight.
More concretely, consider the example given:
class Person {
var residence: Residence?
}
class Residence {
var numberOfRooms = 1
}
let john = Person()
let roomCount = john.residence.numberOfRooms
// error: value of optional type 'Residence?' not unwrapped; did
you mean to use '!' or '?'?
As general rule of thumb, whenever I get an error and the system tells
me what I probably meant, that is a pretty good sign the system isn't
doing all it can for me and making me jump through an unnecessary
hoop.
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't
see understand what else it can do for you. A choice has to be made about
how to handle "The left portion of this might be nil" and an implicit
choice is bad.
Basically "john.residence.numberOfRooms" is a completely wasted
expression -- it's meaningless. You have to put a `?` or `!` in there
to get anything useful. I can't see any good reason for that.
"john.residence.numberOfRooms" could just behave one way or the other,
either as if the `?` were there, or the `!`. And of the two, the
obvious choice is `?` because... I already told the program it the was
optional in "var residence: Residence?". I said it was optional, and
yep I meant that. (Reminds me of the old retort "did I stutter?")
You meant 'this might be nil'. 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.
Thus, if I try to assign it to something else it too should be
optional. If I want it to be otherwise I'd add the `!`.
This seems like a step backward. `?` calls out everyplace that there is
uncertainty about `nothing`. Going back to hidden nil messaging isn'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.
Making this change would just simplify a whole mess of code and about
half that chapter would all but vanish.
It would not simplify the code at all. It would complicate reading it.
In addition, seeing that `!` acts a short-circuit to error, it would
be nice to have something equivalent for fallback value. We can't use
`??` b/c it doesn't chain, though maybe it could be made to? And I'd
rather not reuse `?.` here (for reasons I can explain later). Maybe
`:` is a good choice? In any case, exact syntax aside,
let homelessShelter = Residence()
let roomCount = john.residence:homelessShelter.numberOfRooms
Now, roomCount will not be optional, because there is a guaranteed value.
I think simplifying Optionals this way would be a good fit for Swift,
making this part of the language a whole lot cleaner and clearer.
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.
···
On Sun, Sep 25, 2016 at 4:19 PM, Trans via swift-evolution < swift-evolution@swift.org> wrote:
_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution