例如,我有两个ViewController调用“列表”和“详细信息”。 ListViewController有一个数据数组,当我单击ListViewController的单元格时,ListViewController将推送DetailViewController并将数据传递给DetailViewController,如下所示:
let model = gMetaArray[indexPath.row]
let vc = R.storyboard.main.comicDetailController()!
vc.gMetaModel = model
navigationController?.pushViewController(vc, animated: true)
因此,在DetailViewController中,我得到了数据并使用了它:
guard var data = gMetaModel else { return }
data.sdatas.append(SDataModel())
当我修改数据时,ListViewController的数据数组将更改。
为什么?当我将数据传递给DetailViewController时,不会发生深度复制吗?当我使用guard var data = gMetaModel else { return }
时,是否不会进行深度复制?
如果没有发生,我该如何深度复制数据?
答案 0 :(得分:0)
您的gMetaModel
可能是引用类型。像gMetalModel
和data
这样的变量存储指向对象的引用。在这种情况下,Detail VC中的变量指向与List VC中的变量相同的对象。这就是为什么通过一个变量更改对象会使更改在其他变量访问对象时反映出来的原因。
要解决此问题,您可以将gMetaModel
的类型设置为值类型,即将class
更改为struct
。每次将对象分配给另一个变量时,这都会使对象复制自身。
或者,您可以自己编写一个createCopy
方法。记住还要为createCopy
类型引用的引用类型编写gMetaModel
方法,以进行深层复制。
第三种选择是使gMetaModel
的类型不变。使所有变异方法创建一个新副本。不过,这可能在每种情况下都无法正常工作。