我该如何精确地复制一个数组?
我很难在 Swift 中找到关于复制数组的信息。
我试过用 .copy()
.copy()
var originalArray = [1, 2, 3, 4] var duplicateArray = originalArray.copy()
Arrays have full value semantics in Swift, so there's no need for anything fancy.
var duplicateArray = originalArray就够了。
var duplicateArray = originalArray
如果数组的内容是引用类型,那么是的,这将只复制指向对象的指针。要执行内容的深度副本,可以改为使用 map并执行每个实例的副本。对于符合 NSCopying协议的 Foundation 类,可以使用 copy()方法:
map
NSCopying
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方法只返回对自己的引用,因此上面的测试将产生意想不到的结果。
NSArray
copy
Nate 说得对。如果您使用的是基元数组,那么您所需要做的就是将 double icateArray 分配给 OrigalArray。
为了完整起见,如果您使用的是 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) } }
然后是用于克隆的 Array 扩展:
extension Array where Element: Copying { func clone() -> Array { var copiedArray = Array<Element>() for element in self { copiedArray.append(element.copy()) } return copiedArray } }
差不多就是这样,查看代码和示例检查这个 大意
对于内特的回答,还有第三种选择:
let z = x.map { $0 } // different array with same objects
编辑从这里开始
上面和下面基本上是一样的,实际上使用下面的相等运算符会执行得更好,因为数组不会被复制,除非它被修改(这是设计好的)。
let z = x
阅读更多: https://developer.apple.com/swift/blog/?id=10
编辑到此结束
向此数组添加或移除不会影响原始数组。但是,更改任何对象的任何属性都会在原始数组中看到。因为数组中的对象不是副本(假设数组包含对象,而不是基本数字)。
如果要复制某个类对象的数组的项。 然后,您可以遵循下面的代码而不使用 NSCopying 协议,但是您需要一个 init 方法,该方法应该包含对象所需的所有参数。 下面是在操场上进行测试的示例代码。
class ABC { var a = 0 func myCopy() -> ABC { return ABC(value: self.a) } init(value: Int) { self.a = value } } var arrayA: [ABC] = [ABC(value: 1)] var arrayB: [ABC] = arrayA.map { $0.myCopy() } arrayB.first?.a = 2 print(arrayA.first?.a)//Prints 1 print(arrayB.first?.a)//Prints 2