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

我该如何精确地复制一个数组?

我很难在 Swift 中找到关于复制数组的信息。

我试过用 .copy()

var originalArray = [1, 2, 3, 4]
var duplicateArray = originalArray.copy()
119279 次浏览

Arrays have full value semantics in Swift, so there's no need for anything fancy.

var duplicateArray = originalArray就够了。


如果数组的内容是引用类型,那么是的,这将只复制指向对象的指针。要执行内容的深度副本,可以改为使用 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方法只返回对自己的引用,因此上面的测试将产生意想不到的结果。

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