> On 15 Aug 2016, at 15:29, Justin Jia via swift-evolution 
> <swift-evolution@swift.org> wrote:
> 
> IMO `if x? { }` is not a lot shorter than `if let x = x`.
> 
> The problem with `if let` is, you need to explicit specify { } and call the 
> function inside it. It is good for being explicit, but sometimes you ended up 
> with something like this:
> 
> ```
> /* code 1 */
> if let x = x, let y = y {
>     / * code 2 */
>     let z = foo(x, y)
>     if let z = z {
>         bar(z)
>     }
>     / * code 3 */
> }
> /* code 4 */
> ```
> 
> I would like to use guard if possible, but guard will force you to leave the 
> entire function.
> 
> ```
> / * code 1 */
> guard let x = x, y = y else { return }
> /* code 2 */
> / * some code */
> guard let z = foo(x, y) else { return }
> bar(z)
> / * code 3 */ // note: code 3 and code 4 won’t execute if x, y, or z is nil!
> / * code 4 */ 
> ```
> 
> What I really want is some like this:
> 
> ```
> / * code 1 */
> let z = foo(x?, y?)
> / * code 2 */
> bar(z?)
> / * code 3 */ // note: code 3 and code 4 will still execute even if z is nil!
> / * code 4 */
> ```
> 

The fact that this variant and the guard variant doesn’t do the same thing 
stands out to me. The if-let and guard variants while being more verbose is 
also very explicit about the control flow. While reading that I can fully 
understand under what circumstances code 3 and 4 will be executed. This sugar 
would be more equivalent to this (below), which I’m not sure if everyone would 
expect it to be. I can see people being surprised that code 3 and 4 was 
executed, especially if calling `bar` had some side effects that either code 3 
or 4 was relying on.

/ * code 1 */
let z = x.flatMap { 
  x in y.flatMap { 
    y in foo(x, y)
  }
}
/ * code 2 */
let _ = z.flatMap { z in bar(z) }
/ * code 3 */ // note: code 3 and code 4 will still execute even if z is nil!
/ * code 4 */


> IMO, this is much easier to read.
> 
> Sincerely,
> Justin
> 
> 
>> On Aug 15, 2016, at 7:05 PM, Haravikk <swift-evolut...@haravikk.me 
>> <mailto:swift-evolut...@haravikk.me>> wrote:
>> 
>> 
>>> On 15 Aug 2016, at 08:02, Justin Jia via swift-evolution 
>>> <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.
>> 
>> 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?
>> 
>> But in general, I think it's best to be explicit about the entire statement 
>> being optional, which the conditional does but a postfix on a variable 
>> doesn't to the same degree.
> 
> _______________________________________________
> swift-evolution mailing list
> swift-evolution@swift.org
> 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