[swift-evolution] [Pitch] Change location of 'try' for infix operators

Benjamin Spratling bspratling at mac.com
Tue Oct 11 01:49:30 CDT 2016

The error message is not saying that aFunction throws, it says “??" might throw.  After all, you supplied a ()rethrows->(Int) to it as its second argument, which is wrapping a ()throws->Int, “bFunction()"
?? and && and || wrap the trailing expression in an @autoclosure.

I am a little surprised two “try” are not required.  This would be my expectation:
> let value = try aFunction() ?? try bFunction()
but, using try to the right of a non-assignment operator is not allowed.

This, however, is not disallowed:

let value = try aFunction() ?? (try bFunction())

The purpose of the @autoclosure is to make developers forget they need to write a closure, and it apparently worked for you.

-Ben Spratling

> On Oct 11, 2016, at 1:16 AM, Karl via swift-evolution <swift-evolution at swift.org> wrote:
> You might expect this code to work:
> func aFunction() -> Int?       { return 5 }
> func bFunction() throws -> Int { return 4 }
> let value = aFunction() ?? try bFunction() // ERROR: Operator can throw but expression is not marked with a ‘try'
> print(value)
> Instead, you must put the ‘try’ before the entire expression:
> let value = try aFunction() ?? bFunction()
> This is awkward, since aFunction() doesn’t throw.
> I propose we change the grammar to allow the first example and disallow the second, consistent with the idea that throwing calls are ‘marked’ by using the try keyword.
> Karl
> _______________________________________________
> 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/20161011/1c70b7a1/attachment.html>

More information about the swift-evolution mailing list