我需要深度复制一个Swift
的通用数组。我可以在for循环中逐个复制,但可能有更紧凑的解决方案。
var myArray = [Double](count: 5, repeatedValue: 1.0)
NSLog("%@", myArray)
var copiedArray = myArray
NSLog("%@", copiedArray)
对于深拷贝,对于普通对象而言,可以实现一个支持复制的协议,并使对象类实现此协议,如下所示:
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
}
}
@Sohayb Hassoun 批准了克隆数组的函数:
extension Array where Element: Cloneable {
func clone() -> Array {
let copiedArray: Array<Element> = self.compactMap { $0.cloned() }
return copiedArray
}
}
=
进行赋值会产生真正的副本,而不仅仅是设置引用。 - JánosDouble
这样的值类型可以工作,但是对于像NSString
这样的类类型呢? - Kirsteins