In Swift, the order in which operators are evaluated can have a significant impact on the result of an expression. This order is determined by the operator precedence and associativity. In this tutorial, we’ll explore how these concepts work in Swift.

Let’s start with an example:

let amount = 1 + 2 * 3

The value of amount can vary depending on whether the addition (1 + 2) is calculated before the multiplication (2 * 3). This is determined by the operator precedence. In Swift, the operators have the following precedence, from highest to lowest:

  • Multiplication (*), division (/), and remainder (%)
  • Addition (+) and subtraction (-)
  • Comparisons (==, !=, <, >, <=, >=)
  • Logical AND (&&) and logical OR (||)
  • Ternary conditional (?:)
  • Assignment and compound assignment operators (=, +=, etc.)

In our example, the multiplication has higher precedence than addition, so it is evaluated first:

let amount = 1 + 2 * 3 // amount = 7

You can find a complete table of operator precedence in the Swift documentation.

In cases where multiple operators have the same precedence within an expression, the associativity of the operators comes into play. Associativity determines which operation takes priority when the operators have the same precedence.

Consider the following example:

let amount = 4 / 2 * 5

Depending on whether we perform 4 / 2 or 2 * 5 first, the result could be 10 or 0.4. To resolve this ambiguity, we use associativity. In this case, multiplication is left associative, which means that the expression on the left is executed first. By adding parentheses, we can make the associativity clear:

let amount = (4 / 2) * 5

The operators with left associativity are multiplication (*), division (/), remainder (%), addition (+), subtraction (-), logical AND (&&), and logical OR (||).

On the other hand, assignment and compound assignment operators (=, +=, etc.) and the ternary conditional (?:) are right associative.

Comparisons (==, !=, <, >, <=, >=) do not have associativity.

Understanding operator precedence and associativity is essential for writing correct and predictable code in Swift. By considering these factors, you can ensure that your expressions are evaluated in the intended order.