Остановка ссылочных переменных, изменяющих значение исходной переменной
Я присваиваю значение пользовательского класса другой переменной. Обновление значения новой переменной влияет на значение исходной переменной. Однако мне нужно, чтобы ссылочная переменная не обновляла исходную переменную.
Вот базовое представление о том, что происходит:
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()
Если этого не произойдет, вам придется найти другой способ скопировать его или реализовать протокол самостоятельно.
Обтекание класса в структуре просто создаст две разные структуры, каждая из которых содержит разные ссылки на один и тот же объект.