# [swift-evolution] [Last second] Precedence of nil-coalescing operator seems too low

Jacob Bandes-Storch jtbandes at gmail.com
Mon Sep 5 01:30:07 CDT 2016

```Now you've gotten me thinking about precedence of other operators too.

Since ?? is prone to causing confusion in either direction (cf. your
example and my example), it could be put in its own group whose relation to
the numeric operators is intentionally undefined (thus requiring parens).

I don't know about other folks, but I'll certainly get confused if & and |
and ^ are mixed. What if we removed their relation to each other (requiring
parens when mixing them)?

[image: Inline image 1]

For comparison (ha), here's what we have today:

[image: Inline image 1]

Jacob

On Sat, Sep 3, 2016 at 10:20 PM, Erica Sadun <erica at ericasadun.com> wrote:

> On Sep 3, 2016, at 10:15 PM, Jacob Bandes-Storch <jtbandes at gmail.com>
> wrote:
>
> Perhaps-conversely, what should this code do?
>
>     let nextIndex = foundIndex ?? lastIndex + 1
>
> Jacob
>
>
> It's a good counter example. And there's no optional-associative option.
>
> -- E
>
>
> On Sat, Sep 3, 2016 at 9:05 PM, Erica Sadun via swift-evolution <
> swift-evolution at swift.org> wrote:
>
>> Given: `let x = Optional(3)` then
>>
>> `let y = 5 + x ?? 2` will not compile
>>
>> but
>>
>> `let y = 5 + (x ?? 2)` will.
>>
>>
>> Should NilCoalescingPrecedence be raised? The current operator
>> precedence chain is:
>>
>> BitwiseShiftPrecedence > MultiplicationPrecedence > AdditionPrecedence >
>> RangeFormationPrecedence > CastingPrecedence > NilCoalescingPrecedence >
>> ComparisonPrecedence > LogicalConjunctionPrecedence >
>> LogicalDisjunctionPrecedence > TernaryPrecedence > AssignmentPrecedence >
>> FunctionArrowPrecedence > [nothing]
>>
>>
>> It seems to me that `NilCoalescingPrecedence` should probably be higher
>> than `MultiplicationPrecedence` and possibly higher `
>> BitwiseShiftPrecedence` as its job is to produce an unwrapped value that
>> can then be operated upon.
>>
>> I think CastingPrecedence should be even higher because
>>
>> `expression as? T ?? fallback value`
>>
>> should be parsed as
>>
>> `(expression as? T) ?? (fallback value)`
>>
>>
>> I apologize profusely because I know this is beyond last minute,
>>
>> -- E
>>
>>
>> _______________________________________________
>> 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/20160904/86551167/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: current-precedence.png
Type: image/png
Size: 84116 bytes
Desc: not available
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160904/86551167/attachment.png>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: proposed-precedence.png
Type: image/png
Size: 152283 bytes
Desc: not available
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160904/86551167/attachment-0001.png>
```