Operators: special symbols that work with one to three operands.

Syntax:

1 + 2 == 3
let c = a && b

Operators can be classified as unary, binary, or ternary depending on how many operands they take as input. A unary operator takes one operand, and it can be defined as prefix or postfix. Binary operands are declared infix because they always occur between the two operands. There is only one ternary operator in Swift, the if(x)-then(y)-else(z) shorthand conditional operator of (x ? y : z).

The Arithmetic Operators work with all of the numeric types. Swift also defines the addition operator for strings, to support concatenation. You can define how the operators should work with your custom classes as well.

// Arithmetic Operators
2 + 3 // 5 - Addition
9 - 1 // 8 - Subtraction
4 * 5 // 20 - Multiplication
6 / 3 // 2 - Division
8 % 5 // 3 - Remainder

The Assignment Operator sets the value of the left operand with the value of the right operand. This even works for Tuples. Unlike Objective-C, however, this operator does NOT return a value. This is a safety feature to catch cases where the "==" operator is needed. There are also a set of compound assignment operators, which only work with variables because the left operand is being modified from an earlier value.

// Assignment Operator
let x = 2
var y = x + 5 // No return value, but y is now 7

// assigning multiple values at once via a tuple
let (a,b,c) = (1,2,3)

// Compound Assignment Operators
var x = 5
x *= 2 // Multiple & assign, x=10
x /= 2 // Divide & assign, x=5 again
x %= 2 // Remainder & assign, x=1
x += 7 // Add & assign, x=8
x -= 3 // Subtract & assign, x=5
x <<= 2 // Left bit shift & assign, x=20
x >>= 2 // Right bit shift & assign, x=5
x &= 3 // Bitwise AND & assign, x=1
x ^= 3 // Bitwise XOR & assign, x=2
x |= 6 // Bitwise OR & assign, x=6

By default, Swift will not let you assign a numeric value that would overflow the type the constant or variable was defined as. This behavior can be overridden by using the Overflow Operators.

var tooFull = UInt8.max // set to 255
tooFull += 1 // COMPILER ERROR, OVERFLOW
tooFull &+ 1 // Handled, tooFull is now 0

// These other ones work the same way
tooFull &- 1 // Overflow subtraction
tooFull &* 50000 // Overflow multiplication
tooFull &/ 0 // Overflow division
tooFull &% 5 // Overflow remainder

There are both prefix and postfix versions of the Increment and Decrement Operators.

// Increment Operator
var a = 1
let b = ++a
let c = a++

In the above example, "a" starts at "1". In the second line, the value of "a" is incremented BEFORE the value is returned, so "b" is set to "2". In the third line, the value of "a" is incremented AFTER the value is returned, so "c" is also set to "2", but "a" is now "3"

// Decrement Operator
var x = 5
let y = --x
let z = x--

The mechanics here are the same as with addition. Thus, the end result is x=3, y=4, and z=4. The prefix version of these operators is generally recommended since it provides the intuitive result of returning the modified value.

Comparison Operators return a Bool value, so you can execute conditional statements based on the result. Swift uses the same comparison symbols as C and many other languages.

// Comparison Operators
5 == 6 // Equal to, returns false
5 != 6 // Not equal to, returns true
5 > 6 // Greater than, returns false
5 < 6 // Less than, returns true
5 >= 6 // Greater than or equal to, returns false
5 <= 6 // Less than or equal to, returns true

// Identity Comparisons to check if two object references are the same
var myVar = MyClass()
var otherVar = myVar
var someOtherVar = MyClass()
myVar === otherVar // returns true
myVar === someOtherVar // returns false

The Nil Coalescing Operator is new in Swift. It unwraps an optional if it has a value, otherwise it returns a default value. Short-circuit evaluation ensures that the optional value will only be evaluated if the optional is nil.

let defaultSetting = "Automatic"
var userInput: String?
var result = userInput ?? defaultSetting
// Since userInput defaults to nil, result is "Automatic"

Swift supports two Range Operators: Closed, and Half-Open. A Closed range (a...b) includes all values starting with "a", up to and including "b". A Half-Open range (a..<b) includes all values starting with "a", but NOT including "b". In both cases, "a" must always be less than "b".

// Closed Range
for students in 200...250 {
  println("Student \(students) present and accounted for")
}

// Half-Open Range - best for zero-based arrays
let fruit = ["Apple", "Banana", "Cherry", "Lime"]
for i in 0..<fruit.count {
  println("Add to shopping list: \(fruit[i])")
}

Swift supports three Logical Operators: NOT, AND, OR. These work with Boolean logic values "true" and "false". The NOT operator (!) flips the value of the operand, from true to false, or from false to true. The AND operator (&&) returns true only if both operands are true. The OR operator (||) returns true if either operand is true.

// Logical NOT
let positive = true
if !positive {
  println("Then you must be negative")
}

// Logical AND
let negative = !positive
if positive && negative {
  println("How is this possible??")
}

// Logical OR
if positive || negative {
  println("Figured it was one or the other.")
}