在Swift中如何做“深度复制”?

在Objective-C中,可以通过以下方式深入复制:
Foo *foo = [[Foo alloc] init];
 Foo *foo2 = foo.copy;

如何在Swift深入复制?

深层复制

您的示例不是在StackOverflow中讨论的a deep copy.获取对象的真实深层拷贝通常需要NSKeyedArchiver

快速复制

NScopying协议是提供对象副本的Objective-C方式,因为一切都是一个指针,并且您需要一种管理任意对象副本的生成方式.对于Swift中的任意对象副本,您可以提供一个方便的初始化器,您可以在其中初始化MyObject另一个MyObject,并在init中将值从旧对象分配给新对象.老实说,在Objective-C中基本上是-copy,除了Objective-C进行防御性复制之外,它通常必须在每个子对象上调用副本.

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

几乎一切都是值得的.几乎.

然而,在Swift almost everything is pass-by-value(您应该真的点击上述链接),所以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与结构和类别相关的非逐代码语义的问题,我建议fabulous blog of Mike Ash进行一个真正精心的讨论.

最后,如果你想听到你需要知道的一切,你可以观看the WWDC 2015 Value Semantics video.每个人都应该看这个视频,它真的清除了在Swift内部处理内存的方式,以及它与Objective-C的区别.

相关文章

软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘...
现实生活中,我们听到的声音都是时间连续的,我们称为这种信...
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿...
【Android App】实战项目之仿抖音的短视频分享App(附源码和...
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至...
因为我既对接过session、cookie,也对接过JWT,今年因为工作...