如何制作一个精确的数组副本?
我是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
*编辑*编辑在这里结束
添加或删除此数组不会影响原始数组。 但是,更改任何对象的数组拥有的任何属性将在原始数组中看到。 因为数组中的对象不是副本(假定数组保存对象,而不是原始数字)。