gpt4 book ai didi

ios - 关于 Swift 中复制的问题

转载 作者:行者123 更新时间:2023-11-28 07:43:07 27 4
gpt4 key购买 nike

例如,我有两个 ViewController 调用“List”和“Detail”。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 } 时,深度复制不会发生吗?

如果没有发生,我该如何深度复制数据?

最佳答案

您的 gMetaModel 可能是引用类型。 gMetalModeldata 等变量存储指向对象的引用。在这种情况下,Detail VC 中的变量指向与 List VC 中的变量相同的对象。这就是为什么通过一个变量更改对象会导致更改在您通过另一个变量访问对象时反射(reflect)出来。

要解决此问题,您可以将 gMetaModel 的类型设为值类型,即将 class 更改为 struct。这将使对象在每次将其分配给另一个变量时复制自身。

或者,您可以自己编写一个createCopy 方法。记住还要为 gMetaModel 类型引用的引用类型编写 createCopy 方法,以便进行深拷贝。

第三种选择是使 gMetaModel 的类型不可变。使所有变异方法创建一个新副本。不过,这可能并非在所有情况下都适用。

关于ios - 关于 Swift 中复制的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51681872/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com