[swift-evolution] Proposal: Add syntactic sugar for iterating over an Optional<SequenceType>

Paul Cantrell cantrell at pobox.com
Fri Dec 18 14:56:23 CST 2015

> On Dec 17, 2015, at 4:08 AM, Jeremy Pereira <jeremy.j.pereira at googlemail.com> wrote:
>> On 16 Dec 2015, at 19:52, Paul Cantrell via swift-evolution <swift-evolution at swift.org> wrote:
>> I do this a lot:
>>    for object in array ?? [] {
>> …and it does impair readability a bit at times.
> Does it? It seems fairly understandable to me even though I have never seen it before.

Sure, in that example it’s quite simple. It’s not the “?? []” syntax itself, which is perfectly clear; it’s having that dangling off the end of some longer expression. In real-world context, it does become additional noise.

> I think there is a good reason for keeping this construct a bit “clunky”. Generally APIs give you a nil array for one of two reasons:
> - there was some sort of error in retrieving the elements
> - there were no qualifying elements found.

You’re forgetting the third case, the most common one: things not populated / initialized yet. In that case, we often just want to leave a UI blank, for example, and doing nothing is the right behavior.

Doing nothing is the right behavior in a lot of cases, and since Swift provides optional sugar for “do nothing if nil” in other cases:

    foo?.bar = baz
    if let foo = bar { }

…it makes sense to provide it in for loops too.

True, “do nothing” is not the right behavior in all cases. Thus the `for…in` / `for … in?` distinction.

> In the second case, the API is wrong.

Then a lot of APIs are wrong! NSURLComponents, for example:

        for item in urlComponents.queryItems ?? []
            { queryDict[item.name] = item.value }

But then I don’t think NSURLComponents is making a mistake: it distinguishes “no query string” from “empty query string”, but for the purposes of the loop here, there upshot in both cases is “no query items.”

True, ?? [] is minor noise — but given the clarity and low impact on existing code of a `for … in?` counterpart to `for … in`, it’s worth at least considering that option.



-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20151218/aa0d196e/attachment.html>

More information about the swift-evolution mailing list