Swift Snippet : Map Bool values with Generics in Swift

My problem

It often occurs while writing code that you need to assign a value of a certain type, based on the value of Boolean. To do this there are multiple ways, but the 2 most known are

1. The let’s-write-a-lot-of-code approach

I don’t like the first approach, because it creates a bloated codebase. A better way is to use the ternary operator (also known as the inline-if).

2. The one-line-star-developer (ternary operator) approach

You specify the Boolean you want to evaluate, add a question mark, followed by the value if the Boolean is true, followed by a colon, followed by the value if the Boolean is false.

This is already a big improvement. We went from 6 lines of code to 1 line …
but I have 2 issues with the ternary operator:

  • Readability: People who are not familiar with this operator might be overwhelmed by the question mark – value – colon – value and just go bananas in their heads.
  • Performance: The ternary operator is a real snail when it comes to compile performance. There is an outstanding issue on the Swift Bugs website about this.  To give you an example of how slow it is I created 2 methods.  One method uses the ternary operator, the other one just a regular if/else statement.

I’ve hooked up the Build Time Analyzer tool to check how long it takes for both methods to compile.

Performance between ternary operator and if-else statement

The method with the ternary operator takes 0.4ms to compile, and the method with the if-else statement takes 0.1ms to compile. That’s four times slower! On small codebases you won’t feel it, but our codebase for example takes 1 minute and 40 seconds to compile. So I’m in the process of removing all ternary operators (and other things that increase compile times) in our codebase.

3. My current solution

I’ve created an extension on the Boolean type that uses generics to return a value of a specific type and is also (in my opinion) more readable than the ternary operator. It looks like this.

At first I tried it with the ternary operator, but the ternary operatorgenerics, made it compile 6 times slower! So the obvious choice was to just use an if/else statement. To demonstrate that it really is this slow I’ve created 2 methods that do exactly the same thing. The only difference is that one uses a ternary operator, and the other one a regular if/else statement.

Performance between ternary operator and if-else statement with generics

It’s sad you have to discard cool language features, just because they compile slower, and I’m sure these things will get fixed eventually in a next Swift update.

But still the overall result is a more readable way to express values of a different type based on a Boolean.

If you have other ways of dealing with these kind of things or have other suggestions, just leave a comment and let’s have a discussion!