当前位置: 首页 > 面试题库 >

如何在Swift中进行“深层复制”?

申屠洛华
2023-03-14
问题内容

在Objective-C中,可以通过以下方式进行深度复制:

 Foo *foo = [[Foo alloc] init];
 Foo *foo2 = foo.copy;

如何在Swift中进行深度复制?


问题答案:

深拷贝

您的示例不是在StackOverflow上讨论的深层副本。获得对象的真实深层副本通常需要NSKeyedArchiver

迅速复制

NSCopying协议是提供对象副本的Objective-
C方法,因为一切都是指针,并且您需要一种管理任意对象副本生成的方法。对于Swift中的任意对象副本,您可以提供一个便利的初始化程序,在其中初始化MyObject的另一个MyObject,然后在init中将旧对象的值分配给新对象。坦率地说,这基本上是-copy在Objective-
C中执行的操作,只是由于Objective-C实行防御性复制,通常它必须在每个子对象上调用复制。

let object = MyObject()
let object2 = MyObject(object)

但是,在Swift中,几乎所有东西都是按值传递的(
您应该真正单击上述链接 ),因此大大减少了对NSCopying的需求。在操场上尝试一下:

var array = [Int](count: 5, repeatedValue: 0)
print(unsafeAddressOf(array), terminator: "")
let newArray = array
print(unsafeAddressOf(newArray), terminator: "")
array[3] = 3
print(array)
print(newArray)

您会看到分配不是指针的副本,而是实际上是一个新数组。对于围绕Swift与结构和类有关的非按值复制语义的问题,我进行了精心编写的讨论,我建议使用神话般的博客Mike
Ash。

最后,如果您想从Apple那里了解所有信息,则可以观看WWDC 2015 Value
Semantics视频。每个人都应该观看该视频,它真正清除了Swift中处理内存的方式以及它与Objective-
C的区别。



 类似资料:
  • 问题内容: 我只是在数组上使用过,以为这是一个深复制。 如何执行阵列的深层复制? 我应该遍历它并执行一系列的操作吗? 问题答案: 是的,你应该遍历2D布尔数组以进行深复制。如果你使用的是Java 6,请同时查看方法。 我建议使用Java 6的下一个代码:

  • 问题内容: 我正在尝试执行以下结构的深层副本: 以下是对不起的尝试。看来我在根处创建了一棵新树,但是它的孩子仍然指向内存中的相同地址。 go中是否有任何有用的构造可帮助深度复制构造?如果没有,我将如何自己进行深层复制?请注意,“ Deepcopy ”软件包不再起作用,因为它使用了Go 1发行版中已弃用的一些功能 问题答案: 我离得很近。我应该已经将copyedTree分配给父属性。

  • 问题内容: 我对列表副本有一些问题: 所以之后我得到了E0来自,我做的副本E0通过调用。我猜这里是的较深的副本E0,我通过。但是在主要功能上。 为什么循环之前的结果与for循环之后的结果不同? 下面是我的代码: 问题答案: 不是深层副本。你不使用做出深层副本两者并很浅拷贝)。 你用于深度复制列表。 请参阅以下代码段 现在看deepcopy操作

  • 问题内容: 您如何深度克隆Javascript对象? 我知道有很多基于类似的框架的功能,但是我不想使用类似的框架。 创建深度克隆的最优雅或最有效的方法是什么。 我们确实关心诸如克隆数组之类的边缘情况。不打破原型链,处理自我参考。 我们不在乎是否支持DOM对象的复制,因为存在该原因。 正如我主要想在使用V8引擎的ES5功能中使用深度克隆一样。 [编辑] 在有人建议我之前,先通过原型继承对象创建副本与

  • 我正在尝试将应用程序深入链接到我的网站,但我不知道如何让它进入计算机上的常规旧Instagram,然后再进入Android或iOS设备上的应用程序。我知道这些链接有效,因为我单独尝试过。

  • 问题内容: 下面的对象有一个嵌套对象 我应该如何在减速器中处理它? 我可以如上所述做吗?我只是将整个对象分配给它而不进行复制? 要么 还是应该对对象进行深层复制并将其分配给?谢谢 问题答案: 处理嵌套数据更新的“正确”方法是使用多个浅表副本,每个浅层副本一个。按照您的第一个示例,完全可以完全替换一个字段的新对象当然也可以。 有关如何正确执行不可变更新的一些信息,请参阅不可变更新模式的Redux文档