Предположим, мы написали гипотетическую функцию, о которой вы говорите:
class C {}
func swapTwoC(_ lhs: C, rhs: C) {
let originalLHS = lhs
lhs = rhs
rhs = originalLHS
}
Непосредственная проблема заключается в том, что lhs
и rhs
являются неизменяемыми. Чтобы изменить их, нам нужно сделать изменяемые копии:
func swapTwoC(_ lhs: C, rhs: C) {
var lhs = lhs; var rhs = rhs
let originalLHS = lhs
lhs = rhs
rhs = originalLHS
}
Но теперь проблема в том, что мы мутируем наши копии, а не оригинальные ссылки, которые дал нам вызывающий.
Более фундаментально, проблема заключается в том, что когда вы передаете ссылку (на экземпляр класса, который мы называем объектом) функции, сама ссылка копируется (она ведет себя как тип значения). Если эта функция изменяет значение ссылки, она, как мы видели, изменяет только свою локальную копию.
Когда у вас есть inout C
, и вы передаете &myObject
, то, что вы фактически передаете, является ссылкой на вашу ссылку на myObject
. Когда аргументы функции копируются, то копируется этот «ref to ref». Затем функция может использовать этот «ref to ref», чтобы назначить новое значение для ссылки myObject
, которую имеет вызывающий