[swift-evolution] ternary operator ?: suggestion

Alexandre Lopoukhine superlopuh at gmail.com
Sun Dec 20 11:14:48 CST 2015

Hi all,

I would like to suggest an alternative to this, and would like to hear what you all think. I think that the biggest problems with the current operators are:

1) They are not clear, by themselves or as a pair.
2) ? is associated with optionals
3) The type of the resulting expression is not immediately clear, as it begins as a boolean, and only after the ? are the actual expressions to be assigned

So, using “booleanExpression”, “anExpression” and “alternativeExpression”:

Current Swift:
booleanExpression ? anExpression : alternativeExpression

Paul’s suggested syntax:
?(booleanExpression: anExpression, alternativeExpression) 
/* Shouldn’t this be ?(booleanExpression: true: anExpression, false: alternativeExpression), for it to be a true equivalent to switch, or should the boolean shorthand be hard-coded?

My suggestion:
(anExpression if booleanExpression else alternativeExpression)

The logic here is:
1) by adding the keywords, the expression becomes more verbose, but also clearer
2) the “?" is gone
3) it begins with an expression of the result type

I think that requiring the parentheses might be a good idea, as it immediately flags the first expression as not being alone, especially if the expression is separated across multiple lines.
Having “if” after the first expression also clearly distinguishes it as different from the “if” used for control flow.

The obvious loss to Paul’s proposal is the loss of switch-level power, but I’m not convinced that this is too bad. Switch statements are great, but can grow quite long with various patterns, and I think should be kept (with current syntax required) as-is.

What do you think?

— Sasha

More information about the swift-evolution mailing list