不同UIViewControllers中变量的奇怪行为

时间:2018-06-28 17:34:03

标签: swift

我有两个UIViewControllers(MasterDetail简单地说)。在我的Master Controller中,我有一个tableView,其中包含一些对象列表,并且我正在使用Detail Controller来显示详细信息并更改这些对象的某些属性。

这似乎非常简单明了。

假设我有一个具有这种结构的对象:

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

在我的Master Controller中,将显示用户列表,在我的Detail Controller中,我希望能够删除lastPoints

didSelectRowAt的{​​{1}}中,我有:

Master Controller

之后,我可以在let suVC = ShowUserViewController() suVC.currentUser = self.usersToShow[indexPath.row] self.navigationController?.pushViewController(suVC, animated: true) 中使用这个新变量。例如,我可以删除Detail Controller中的最后一个点。

问题是,该currentUser也将立即从lastPoint的{​​{1}}中删除,我需要避免这种情况(而且我也想了解造成这种情况的原因是什么)这种行为:是的,在大多数情况下,这似乎是合乎逻辑的,甚至很方便,但我不记得以前的项目中的这种行为。

2 个答案:

答案 0 :(得分:2)

这是因为User是一个类,在Swift中是引用类型。当您的详细信息控制器获取当前用户时,它将共享对主控制器中所示的完全相同的User实例的引用。由于它是同一用户,因此对lastPoints的更改将同时反映在两个地方。

答案 1 :(得分:2)

原因很简单,类数组是引用类型,因此将其更改为

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

其中struct是值类型