如何制作一个精确的数组副本?

我是Swift语言的初学者。

我将如何做一个数组的确切副本?

我很难find有关在Swift中复制数组的信息。

我尝试使用.copy()

 var originalArray = [1, 2, 3, 4] var duplicateArray = originalArray.copy() 

数组在Swift中具有完整的价值语义,所以不需要任何幻想。

var duplicateArray = originalArray是你所需要的。


如果你的数组的内容是一个引用types,那么是的,这只会复制指针到你的对象。 要执行内容的深层副本,您将改为使用map并执行每个实例的副本。 对于符合NSCopying协议的Foundation类,可以使用copy()方法:

 let x = [NSMutableArray(), NSMutableArray(), NSMutableArray()] let y = x let z = x.map { $0.copy() } x[0] === y[0] // true x[0] === z[0] // false 

请注意,在这里有一些缺陷,Swift的价值语义正在努力保护你,例如,因为NSArray代表一个不可变的数组,它的copy方法只是返回一个对自身的引用,所以上面的testing会产生意想不到的结果。

Nate是正确的。 如果您正在使用原始数组,则只需将duplicateArray指定给originalArray即可。

为了完整起见,如果您正在使用NSArray对象,则需要执行以下操作来完成NSArray的完整拷贝:

 var originalArray = [1, 2, 3, 4] as NSArray var duplicateArray = NSArray(array:originalArray, copyItems: true) 

对于普通对象,可以做的是实现一个支持复制的协议,并使对象类实现这样的协议:

 protocol Copying { init(original: Self) } extension Copying { func copy() -> Self { return Self.init(original: self) } } 

然后克隆数组扩展名:

 extension Array where Element: Copying { func clone() -> Array { var copiedArray = Array<Element>() for element in self { copiedArray.append(element.copy()) } return copiedArray } } 

这是非常多的,查看代码和样本检查这个要点

Nate的答案还有第三个选项:

 let z = x.map { $0 } // different array with same objects 

*编辑*编辑从这里开始

上面基本上和下面一样,实际上使用下面的等号运算符会更好,因为数组不会被复制,除非它被改变(这是devise)。

 let z = x 

在这里阅读更多: https : //developer.apple.com/swift/blog/?id = 10

*编辑*编辑在这里结束

添加或删除此数组不会影响原始数组。 但是,更改任何对象的数组拥有的任何属性将在原始数组中看到。 因为数组中的对象不是副本(假定数组保存对象,而不是原始数字)。