如何制作一个快速的类对象数组的深层副本

Win*_*ero 6 ios swift

所以我知道swift数组是作为struct实现的,它会自动自动复制.

我已经写了我的课MyClass,我已经实现copyWithZone了复制它

但是,我的swift数组包含我的MyClass对象,例如:

var array = [MyClass]()

当我想制作那个阵列的副本时

var anotherArray = array

它仍然没有调用MyClassObject.copyWithZone,后来如果我更改了对象属性array,anotherArray也会反映出更改.

如何在编写for循环来迭代每个对象的情况下复制它?

它不像swift中的对象数组的深层副本那样重复,因为我不能使用struct来重写我的类.

Dun*_*n C 8

作为一个简单的声明,您可以使用如下代码:

var copiedArray = array.map{$0.copy()}
Run Code Online (Sandbox Code Playgroud)

请注意,术语"deepCopy"对于您所谈论的内容有点误导.如果数组是异构的并且包含其他容器(如数组,字典,集合以及其他自定义容器和"叶子"对象),该怎么办?你应该做的是创建一个DeepCopiable协议,并要求任何符合DeepCopiable的对象要求任何子对象也符合DeepCopiable协议,并编写deepCopy()方法以递归方式调用所有对象的deepCopy()儿童对象.这样你最终可以使用任意深度的深拷贝.

  • 深层复制涉及复制数组中的每个对象.在某种程度上,您必须遍历成员并复制它们.即使Swift数组有一个deepCopy方法,该方法也需要遍历数组的内容并复制它们.map语句为您提供所需的内容,而无需编写循环. (2认同)

ran*_*ngh 5

如果数组的元素是引用类型,则使该元素与 NSCopying 一致并实现copyWithZone方法。

class Book {
    var name: String

    init(_ name: String) {
        self.name  = name
    }
}

extension Book: NSCopying {
    func copy(with zone: NSZone? = nil) -> Any {
        return Book(name)
    }
}
Run Code Online (Sandbox Code Playgroud)

现在实现一个数组扩展来进行深复制

extension Array where Element: NSCopying {
      func copy() -> [Element] {
            return self.map { $0.copy() as! Element }
      }
}
Run Code Online (Sandbox Code Playgroud)

测试代码库

let b1 = Book("Book1")
let b2 = Book("Book2")

let list = [b1, b2]
let clonedList = list.copy()
Run Code Online (Sandbox Code Playgroud)

clonedList现在是两个的副本list,如果您对其中任何一个进行更改,都不会互相影响。