> On Aug 15, 2016, at 9:46 AM, Justin Jia via swift-evolution > <swift-evolution@swift.org> wrote: > > I think the `?` will make the return an optional. So your example should add > another ? at the end. > > ``` > print(foo(bar(42)?, baz(42)?)?)
This reads terribly, IMHO. > ``` > > The above example should be equivalent to: > > ``` > let x = bar(42) // X is optional > let y = baz(42) // Y is optional > > let z = foo(x?, y?) // Z should be optional now > print(z?) > ``` > > which should be equivalent to; > > ``` > let x = bar(42) > let y = baz(42) > > if let x = x, let y = y { > z = foo(x, y) > } What if baz doesn't return optional? if let x = bar(42) { let y = baz(42) z = foo(x, y) } or let y = baz(42) if let x = bar(42) { z = foo(x, y) } If both are evaluated, this is really inconsistent with if let x = bar(42), y = baz(42) { ... } which will short-circuit and baz will not be evaluated if x is evaluated as nil. > > if let z = z { > print(z) > } > ``` > > We don’t need to worry about “short-circuit” now because it should be > equivalent to the above syntax. > > > It has been mentioned before (more than once, perhaps, but not in its own > > thread I don't think, so good luck finding it). IIRC, one of the problems > > is that it's unclear what happens if your function takes multiple > > arguments. Does evaluation proceed from left to right? does it > > short-circuit? Put concretely: > > > > ``` > > func bar(_ x: Int) ->Int? { /* side effects */ } > > func baz(_ y: Int) ->Int? { /* side effects */ } > > func foo(_ z: Int, _ a: Int) ->Int { /* ... */ } > > > > print(foo(bar(42)?, baz(42)?)) > > ``` > > > > Does baz(42) get evaluated if bar returns nil? Does bar(42) get evaluated > > if baz returns nil? > > > > > > On Mon, Aug 15, 2016 at 2:02 AM, 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? > > > > > > Thanks, > > > Justin > > > > > > _______________________________________________ > > > swift-evolution mailing list > > > swift-evolution@swift.org > > > <mailto:swift-evolution@swift.org>(mailto: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
_______________________________________________ swift-evolution mailing list swift-evolution@swift.org https://lists.swift.org/mailman/listinfo/swift-evolution