Странное поведение переменных в разных UIViewControllers - PullRequest
0 голосов
/ 28 июня 2018

У меня есть два UIViewControllers (Master и Detail, проще говоря). В моем Master Controller у меня есть tableView с некоторым списком объектов, и я использую Detail Controller, чтобы показать детали и изменить некоторые свойства этих объектов.

Это кажется очень простым и понятным.

предположим, у меня есть объект с такой структурой:

class User {
   var name = ""
   var lastPoints:[LastPoint] = []
 }

В моем Master Controller я покажу список пользователей, а в моем Detail Controller я хочу иметь возможность удалить lastPoints.

так что в didSelectRowAt моего Master Controller у меня есть:

let suVC = ShowUserViewController()
suVC.currentUser = self.usersToShow[indexPath.row]
self.navigationController?.pushViewController(suVC, animated: true)

и после этого я могу работать с этой новой переменной в моем Detail Controller. Например, я могу удалить одну из последних точек в currentUser.

Дело в том, что это lastPoint будет немедленно удалено из self.usersToShow[indexPath.row] из Master Controller, и мне нужно этого избегать (а также я хочу понять, в чем причина такого поведения: да, это кажется логичным и даже удобным в большинстве случаев, но я не помню такого поведения в предыдущих проектах).

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Причина проста: массив классов является ссылочным типом, поэтому измените его на

struct User {
   var name = ""
    var lastPoints:[LastPoint] = []
}

, где struct - тип значения

0 голосов
/ 28 июня 2018

Это потому, что Пользователь - это класс, который является ссылочным типом в Swift. Когда ваш подробный контроллер получает текущего пользователя, он делится ссылкой на тот же экземпляр User, который показан в главном контроллере. Поскольку это один и тот же пользователь, изменение его lastPoints будет отражено в обоих местах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...