当数组的元素为对象时才考虑深拷贝,如果是结构就没有意义了。
只有数组的对象支持NSCopying协议时,数组才可以支持深拷贝。
有了如上共识,我们可以很快写出Demo来:
首先是测试类:
class Foo:NSCopying{ func copy(with zone: NSZone? = nil) -> Any { let copiedObj = Foo(name: name) return copiedObj } var name = "none" init(name:String) { self.name = name } }
然后是数组扩展:
extension Array where Element:NSCopying{ ///返回元素支持拷贝数组的深拷贝 public var copy:[Element]{ return self.map {$0.copy(with: nil) as! Element} } }
最后是测试:
var ary = [Foo]() ary.append(Foo(name: "bigWang")) ary.append(Foo(name: "smallWang")) //var ary_cpy = Array(ary) 浅拷贝! var ary_cpy = ary.copy //深拷贝 ary_cpy[0].name = "none" print("ary 1st name : \(ary[0].name)") print("ary_cpy 1st name : \(ary_cpy[0].name)")
如你所愿,修改ary中元素,不会对ary_cpy中元素造成影响,这样我们就实现了数组的深拷贝。