$0 is a shortcut to mean "first argument" in a closure.
So, consider
let digits = [1,4,10,15]
let even = digits.filter { $0 % 2 == 0 }
let odd = digits.filter { val in val % 2 == 1 }
print("even", even)
print("odd", odd)
will produce
even [4, 10]
odd [1, 15]
So, the following are equivalent:
- long form, where everything is explicitely expressed
let even = digits.filter { (val: Int) -> Bool in return val % 2 == 0 }
The closure takes an Int parameter and return a Bool to tell is item must be filtered in
- a bit shorter, return not needed with a single expression in the 'in'
let even = digits.filter { (val: Int) -> Bool in val % 2 == 0 }
- As the type returned by the closure can be inferred, we can omit:
let even = digits.filter { (val: Int) in val % 2 == 0 }
- idem, type of argument is inferred from the type of digits items ([Int], so we can simplify further
let even = digits.filter { val in val % 2 == 0 }
- and finally, instead of naming the argument and calling in, we can express the shortest, replacing by $0:
let even = digits.filter { $0 % 2 == 0 }
Should read the Swift Reference (search for closure)