如何克隆Swift泛型数组?

4

我需要深度复制一个Swift的通用数组。我可以在for循环中逐个复制,但可能有更紧凑的解决方案。

3个回答

2
尝试这个:
var myArray = [Double](count: 5, repeatedValue: 1.0)
NSLog("%@", myArray)
var copiedArray = myArray
NSLog("%@", copiedArray)

1
是的,同时我注意到使用=进行赋值会产生真正的副本,而不仅仅是设置引用。 - János
2
这实际上是浅复制。对于 Double 这样的值类型可以工作,但是对于像 NSString 这样的类类型呢? - Kirsteins
只需将数组初始化为字符串: var threeDoubles = [String](count: 3, repeatedValue: "myString") 对于任何其他类型,请使用您的对象类型进行初始化。 - NSSakly
1
copiedArray 是 Swift 中 myArray 的浅拷贝。 - Dilip Lilaramani
1
这确实是一个浅拷贝。 - Ferschae Naej

2

对于深拷贝,对于普通对象而言,可以实现一个支持复制的协议,并使对象类实现此协议,如下所示:

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
    }
}

这就是全部内容了,如需查看代码和示例,请访问此Gist

0

@Sohayb Hassoun 批准了克隆数组的函数:

extension Array where Element: Cloneable {

    func clone() -> Array {
        let copiedArray: Array<Element> = self.compactMap { $0.cloned() }
        return copiedArray
    }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接