Как предотвратить перезапись объекта - swift? Объект в ViewController1 перезаписывается объектом того же типа в ViewController2

Это всего лишь визуальный сценарий того, что происходит на самом деле.

У меня есть объект A в моем View Controller1. Точно так же у меня есть ObjectB, который похож на тип ObjectA в моем View Controller2.

Теперь, нажав кнопку, я назначаю ViewController2.ObjectB = ViewController1.ObjectA (или self.ObjectA) из моего 1-го контроллера представления.

Теперь данные успешно передаются в ViewController2. Но когда я вношу некоторые изменения в ObjectB в ViewController2, изменения также отражаются в ObjectA ViewController1.

Этого не должно происходить, поскольку исходные данные ObjectA затем теряются, что мне нужно, если пользователь переходит туда и обратно из ViewController1 в ViewController2 и наоборот, поскольку я всегда делаю это ViewController2.ObjectB = ViewController1.ObjectA при нажатии моей кнопки в ViewController1.

Кто-нибудь знает, что происходит? Пожалуйста, помогите мне. Это сводит меня с ума :-(


person Zahurafzal Mirza    schedule 04.04.2018    source источник
comment
Используйте структуру вместо класса. Структуры имеют типы значений. Подробнее читайте здесь: stackoverflow.com/q/24232799/3151675   -  person Tamás Sengel    schedule 04.04.2018
comment
Извините, но я не могу использовать структуры, так как мои классы объектов генерируются SwiftyJSON. Таким образом, использование struct означало бы большое отставание для всего моего проекта. Можете ли вы предложить какую-то другую альтернативу?   -  person Zahurafzal Mirza    schedule 04.04.2018
comment
Попробуйте реализовать метод копирования. stackoverflow.com/q/24242629/3151675   -  person Tamás Sengel    schedule 04.04.2018


Ответы (1)


Это происходит потому, что ваш объект передается по ссылке, а не по значению. Что вы можете сделать, так это создать клон вашего объекта вместо передачи самого объекта.

ViewController2.ObjectB = ViewController1.ObjectA.clone()

Вы должны реализовать функцию клонирования в классе ObjectA, которая будет создавать новый объект из текущего, что-то вроде этого

class MyClass {
    let number: Int

    init(number: Int) { 
        self.number = number
    }

    func clone() -> MyClass {
        return MyClass(number: self.number)
    }
}

Если вы хотите узнать больше, найдите https://developer.apple.com/swift/blog/?id=10 и https://www.raywenderlich.com/112027/reference-value-types-in-swift-part-1

person markoaras    schedule 04.04.2018
comment
я знаю, что это было передано по ссылке. Я новичок в Swift, поэтому я был немного не уверен, происходит ли это или нет. Благодаря вам я наконец понял это. Теперь я надеюсь, что ваше решение работает :-D. Я реализую это прямо сейчас и дам вам знать - person Zahurafzal Mirza; 04.04.2018
comment
хорошо, просто будьте осторожны с типами ObjectA и ObjectB в вашем случае, но я предполагаю, что вы поняли это, так как вы написали строку ViewController2.ObjectB = ViewController1.ObjectA в своем вопросе - person markoaras; 04.04.2018
comment
сила с тобой сильна :-D хаха..спасибо за решение - person Zahurafzal Mirza; 06.04.2018