在Objective-C中,可以通过以下方式进行深度复制:
Foo *foo = [[Foo alloc] init]; Foo *foo2 = foo.copy;
如何在Swift中进行深度复制?
您的示例不是在StackOverflow上讨论的深层副本。获得对象的真实深层副本通常需要NSKeyedArchiver
NSKeyedArchiver
该NSCopying协议是提供对象副本的Objective- C方法,因为一切都是指针,并且您需要一种管理任意对象副本生成的方法。对于Swift中的任意对象副本,您可以提供一个便利的初始化程序,在其中初始化MyObject的另一个MyObject,然后在init中将旧对象的值分配给新对象。坦率地说,这基本上是-copy在Objective- C中执行的操作,只是由于Objective-C实行防御性复制,通常它必须在每个子对象上调用复制。
NSCopying
-copy
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的区别。