> On 15 Aug 2016, at 21:27, Xiaodi Wu <xiaodi...@gmail.com> wrote:
> 
> On Mon, Aug 15, 2016 at 1:57 PM, Haravikk via swift-evolution 
> <swift-evolution@swift.org <mailto:swift-evolution@swift.org>> wrote:
> 
>> On 15 Aug 2016, at 13:44, Tim Vermeulen <tvermeu...@me.com 
>> <mailto:tvermeu...@me.com>> wrote:
>> 
>>>> On 15 Aug 2016, at 08:02, Justin Jia via 
>>>> swift-evolution<swift-evolution@swift.org 
>>>> <mailto:swift-evolution@swift.org>(mailto:swift-evolution@swift.org 
>>>> <mailto:swift-evolution@swift.org>)>wrote:
>>>> Hi!
>>>> 
>>>> I don’t know if this has came up before. I tried to search though the 
>>>> mailing list but didn’t find any related threads.
>>>> 
>>>> This is purely a syntactic thing (which I know it’s the lowest priority 
>>>> for Swift 4), but I think it’s an important one.
>>>> 
>>>> Let’s say we have a struct with a function:
>>>> 
>>>> ```
>>>> struct Foo {
>>>> func bar(x: Int)
>>>> }
>>>> ```
>>>> 
>>>> We can use optionals:
>>>> 
>>>> ```
>>>> let foo: Foo? = nil
>>>> let x = 1
>>>> foo!.bar(x: x) // Able to compile, but will cause runtime error
>>>> foo?.bar(x: x) // Able to compile, and won't cause runtime error
>>>> ```
>>>> 
>>>> However:
>>>> 
>>>> ```
>>>> let foo = Foo()
>>>> let x: Int? = nil
>>>> foo.bar(x: x!) // Able to compile, but will cause runtime error
>>>> foo.bar(x: x?) // Won't compile
>>>> ```
>>>> 
>>>> I propose that we should allow `foo.bar(x: x?)`, which should be 
>>>> equivalent to:
>>>> 
>>>> ```
>>>> if let x = x {
>>>> foo.bar(x: x)
>>>> }
>>>> ```
>>>> 
>>>> What do you think?
>>> I like the intent behind this, but personally I think it's not clear 
>>> enough. For me, putting the statement in a conditional as you've shown is 
>>> the better solution, as it's a lot clearer exactly what's going on. Putting 
>>> a question mark on a variable makes it look like something specific to that 
>>> variable, rather than preventing the entire statement from executing.
>> 
>> I get where you’re coming from, but how would people react if optional 
>> chaining wasn’t in the language yet and someone proposed it now? I know it’s 
>> not strictly the same thing, but it’s still a single question mark that 
>> prevents the whole statement from being executed. I think it would be met 
>> with a lot of resistance from people saying that being more explicit with 
>> `if let` is the way to go.
> 
> True, but with optional chaining the position of the question mark makes it a 
> lot more clear where it stops, whereas in this proposal the question mark 
> seems a bit less intuitive since it's within the parenthesis yet affecting 
> the statement outside of it.
> 
>>> There may be some alternatives though, for example, what about a shorthand 
>>> for the conditional like so:
>>> 
>>> if let x? { foo.bar(x: x) }
>>> if x? { foo.bar(x: x) } // even shorter?
>> 
>> The alternatives you’ve come up with would only work if foo.bar doesn’t 
>> return anything. If it does return something, and you want to assign it to a 
>> variable, you have to declare the variable beforehand and it just becomes 
>> ugly. It’s then probably a better idea to use map/flatmap:
> 
> Hmm, what about something involving the where keyword? Something like:
> 
> let value = foo.bar(x: x) where x?
> 
> Some people have queried the ability to use where in assignments before, as 
> another way to have a statement be nil if a condition isn't met, but in this 
> case the condition is that x is unwrapped (thus valid for the call). This 
> basically lets you use it like a "retroactive" conditional, it'd be nice to 
> get the same x? behaviour on for loops anyway (letting you unwrap values that 
> way, and maybe test them too).
> 
> `let value = (x == nil) ? nil : foo.bar(x: x)` isn't so bad, is it?

In my opinion, it is. And you’d even need to write `foo.bar(x: x!)`, right?

> You could even write a custom operator to sugar it.
>  
> 
> _______________________________________________
> swift-evolution mailing list
> swift-evolution@swift.org <mailto:swift-evolution@swift.org>
> https://lists.swift.org/mailman/listinfo/swift-evolution 
> <https://lists.swift.org/mailman/listinfo/swift-evolution>
> 
> 

_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to