[swift-evolution] Allow let binding of non-optionals

Jacob Bandes-Storch jtbandes at gmail.com
Thu Jan 7 12:59:00 CST 2016


Well, I don't think it should be universally allowed.

Consider:

    if let value = getValue() {
        // do something with value
    }

If getValue() returns an optional, this is fine. But if it's non-optional,
then you've introduced an "if" when there really is *no* conditional
control flow happening. This should still be a compiler error.

It gets trickier when you mix optional and non-optional values:

    if let value1 = somethingOptional(),
        let value2 = somethingNonOptional()
    {
        // should this be allowed?
    }


    if let value1 = somethingNonOptional(),
        let value2 = somethingOptional()
    {
        // How about this?
    }

Here's an alternative idea: allow non-optional bindings in "do" blocks:

    *do let* value = somethingNonOptional() {
        // use value
    } // value is out of scope now


And perhaps you could combine them with if-statements:

    if let value1 = somethingOptional(),
        *do let* value2 = somethingNonOptional()
        where value2 < value1
    {
        // use the values
    }


Jacob Bandes-Storch

On Thu, Jan 7, 2016 at 10:41 AM, Gwendal Roué <swift-evolution at swift.org>
wrote:

> +1.
>
> `if let` does two things: 1. unwrap the optional, 2. define a new
> variable, scoped to the `if` statement.
>
> Sometimes we don’t need the unwrapping, but we’d like the new, temporary,
> scoped variable.
>
> Gwendal
>
>
> > Le 7 janv. 2016 à 07:40, Russ Bishop via swift-evolution <
> swift-evolution at swift.org> a écrit :
> >
> > I often want to bind variables to a specific scope, or perhaps I have
> three optionals I want to bind and one non-optional. (Often I need that
> non-optional value as part of a where condition check but not being able to
> bind it means I leak the variable to the outer scope).
> >
> > Not being able to bind non-optionals breaks the flow of the code and
> forces me to make a minor context switch when it really doesn’t matter, nor
> does it aid code clarity.
> >
> >
> > Does anyone have strong thoughts about this? I tried searching the
> evolution repo and the mailing list and didn’t see anything.
> >
> >
> > —russ
> > _______________________________________________
> > swift-evolution mailing list
> > swift-evolution at swift.org
> > https://lists.swift.org/mailman/listinfo/swift-evolution
>
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160107/0b4acda5/attachment.html>


More information about the swift-evolution mailing list