Pyry,

> Let me put it differently: I still haven't seen, nor was I able to conceive 
> myself, a realistic example where `??` would cause problems.


An example of broken code from real project:

let allParameters: [String: Any?] =
 defaultParameters["sendMessage"] ?? [:] +
 parameters +
 ["chat_id": chat_id, "text": text]

I think that the precedence of ?? is counter-intuitive because it's mainly used 
as
nil-unwrapping operator and there are often multiple optionals in an expression.
It's too easy to make errors like this one:

let value = x ?? defaultX + y ?? defaultY
let value = x ?? (defaultX + y ?? defaultY)

Imho braces should be required in these expressions.

Even this expression is confusing and in my opinion would only benefit from
braces:
let value = x ?? defaultX + modifier

Also, low precedence of ?? is a source of confusion in other languages, for 
example:
http://www.codeproject.com/Tips/721145/Beware-The-null-coalescing-operator-is-low-in-the
 
<http://www.codeproject.com/Tips/721145/Beware-The-null-coalescing-operator-is-low-in-the>
but in C# this operator isn't used as often as in Swift, so it's not a major 
issue there.

Andrey


> On 08 Sep 2016, at 15:20, Pyry Jahkola via swift-evolution 
> <[email protected]> wrote:
> 
> Vladimir,
> 
> I don't disagree with you about bitwise operations (please read my email 
> again). I'm saying when it comes to `??`, we don't have the evidence 
> necessary for proposing a breaking change.
> 
>> On 08 Sep 2016, at 14:21, Vladimir.S <[email protected] 
>> <mailto:[email protected]>> wrote:
>> 
>> Why do you need to see some precedence (…) while this construction is so 
>> simple and obviously would be used often and *will* cause bugs. (…)
> 
> Let me put it differently: I still haven't seen, nor was I able to conceive 
> myself, a realistic example where `??` would cause problems.
> 
>>> The original motivation by Erica simply failed to compile (…)
>> 
>> Sorry, but you are just not right.
> 
> Let me remind you that the original motivation from Erica wasn't about which 
> way `foundIndex ?? lastIndex + 1` goes but about whether `let y = 5 + x ?? 2` 
> compiles at all.
> 
>> The code compiles without even warning:
>> 
>> let foundIndex : Int? = 1
>> let lastIndex = 2
>> 
>> let nextIndex = foundIndex ?? lastIndex + 1
> 
> It certainly does compile. But is it realistic? Look at the variable names: 
> does this code make any sense at all? What is `lastIndex`? What is `lastIndex 
> + 1`? Why not `things.endIndex`? Indeed, why not:
> 
>     let foundIndex: Int? = things.index(of: something)
>     let nextIndex = foundIndex.map { $0 + 1 } ?? things.endIndex
> 
> That said, I give you the benefit of the doubt – I still believe there can be 
> examples where `??` may be confusing. But without seeing any such examples 
> from the real world, I don't think we have a case for changing `??`.
> 
>> After I showed the code compiles, would you change your opinion?
> 
> No, not with these examples.
> 
> * * *
> 
> Finally:
> 
>> IMO the best solution (…) would be to require (…) parenthesis when operators 
>> from different groups are mixed in the same expression. IMO no need in 
>> complex rules to make Swift safer. I.e. when you have a = 10 + 5 * 10 - you 
>> don't need parenthesis, when you have a = b << 4  - also all is ok, but if 
>> you have a = b << 4 + 5 * 10 - you'll have a warning until add parenthesis 
>> to make your intention clear. (…)
> 
> Look, changing how `b << 4 + 5 * 10` is compiled is exactly what I was 
> proposing. With my changes, it would become a compiler error. IMO, it ought 
> to be parenthesised explicitly as either
> 
>     (b << 4) + 5 * 10
> 
> or
> 
>     b << (4 + 5 * 10)
> 
> depending on which one was intended.
> 
> — Pyry
> 
> _______________________________________________
> swift-evolution mailing list
> [email protected]
> https://lists.swift.org/mailman/listinfo/swift-evolution

_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to