Как передать переменную в качестве ссылки?
Суть
В Swift аргументы передаются по значению: функция получает копию (для класса — копию ссылки, поэтому объект общий и без дополнительных слов). Чтобы функция могла изменить переменную вызывающего кода, параметр объявляют inout, а при вызове ставят &.
func increment(_ x: inout Int) { x += 1 }
var n = 1
increment(&n)
print(n) // 2
func swapValues<T>(_ a: inout T, _ b: inout T) { (a, b) = (b, a) }
var x = 1, y = 2
swapValues(&x, &y)
print(x, y) // 2 1
var arr = [1, 2]
// swapValues(&arr[0], &arr[1])
// error: overlapping accesses to 'arr', but modification requires
// exclusive access (закон эксклюзивности, SE-0176)
arr.swapAt(0, 1)
final class Box { var value = 0 }
func fill(_ box: Box) { box.value = 42 } // ссылка общая и без inout
let box = Box()
fill(box)
print(box.value) // 42
Продолжение ответа с кодом и уточняющими вопросами интервьюера — в приложении DevPrep.
Полный ответ — в DevPrep