Остановка ссылочных переменных, изменяющих значение исходной переменной

Я присваиваю значение пользовательского класса другой переменной. Обновление значения новой переменной влияет на значение исходной переменной. Однако мне нужно, чтобы ссылочная переменная не обновляла исходную переменную.

Вот базовое представление о том, что происходит:

var originalVariable = CustomClass()

originalVariable.myProperty = originalValue

var referenceVariable = originalVariable 

referenceVariable.myProperty = updatedValue

print("\(originalVariable.myProperty)") //this prints the ->updatedValue<- and not the ->originalValue<-

Я попытался обернуть referenceVariable в структуру, чтобы сделать ее типом значения, но это не решило проблему.

Я нашел информацию, касающуюся значений и ссылочных типов, но не смог найти решение.

Мой вопрос в двух словах: как мне остановить обновление ссылочной переменной от обновления исходной переменной, от которой ей присвоено значение?

Заранее спасибо.

1 ответ

Решение

Вся семантика ссылочной точки (используемая классами) состоит в том, что все переменные указывают на один и тот же (то есть ссылаются на один и тот же) объект в памяти. Если вы не хотите такого поведения, вы должны использовать типы значений (Struct, Enum, Array...) или создавать копии вашего объекта.

Если CustomClass реализует NSCopying протокол вы можете сделать:

var referenceVariable = originalVariable.copy()

Если этого не произойдет, вам придется найти другой способ скопировать его или реализовать протокол самостоятельно.

Обтекание класса в структуре просто создаст две разные структуры, каждая из которых содержит разные ссылки на один и тот же объект.

Другие вопросы по тегам