微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在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的区别.

原文地址:https://www.jb51.cc/swift/318894.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐