一尘不染

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

swift

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

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

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


阅读 264

收藏
2020-07-07

共1个答案

一尘不染

深拷贝

您的示例不是在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的区别。

2020-07-07