DevPrep

Все темы › Язык Swift

Как передать переменную в качестве ссылки?

Junior PRO

Суть

В 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

Потренируйтесь перед собеседованием

В DevPrep эти ответы превращаются в задачи на минуту: что напечатает код, найди баг, пробное собеседование. По задаче в день.

Скачать DevPrep в App Store