Swift 4复制数组的值

5

我有一个数组var arr = [myObject],我想将它复制到arr2中,以便在第二个中修改对象时,第一个仍保持原样(按值复制)。该如何实现?


我相信这个问题已经在这里得到了回答:https://dev59.com/dIrda4cB1Zd3GeqPNYav - Martin Muldoon
你所期望的行为恰好是 Swift 值类型(例如 Array)的默认行为。因此,每当你将一个数组分配给一个新变量时,你可以修改它而不影响原始数组。 - dr_barto
1
不过,如果数组包含引用类型,则不适用。 - Martin Muldoon
一个恰当的答案取决于你的数组中包含什么。你的数组包含类、结构体还是枚举? - rmaddy
3个回答

12

如果数组中的类型是枚举或结构体,那就没有问题。你不需要考虑它:

var a = [1,2,3]
var b = a
b[1] = 3
b // [1, 3, 3]
a // [1, 2, 3]

如果您的数组包含一个类,那么您需要考虑如何复制对象,因为默认情况下,您将使用指向相同实例的指针:

let ns = NSMutableArray()
var arr = [ns]
var arr2 = arr

arr2[0].add(2)
arr[0] // [2]

但是,如果类采用了NSCopying协议,您可以使用copy()和mutableCopy()来制作必要的副本以解决这个问题:

var arr3 = arr.map(){$0.mutableCopy() as! NSMutableArray}
arr3[0].add(1)
arr3[0] // [2, 1]
arr[0] // [2]
arr2[0] // [2]

如果一个类没有采用NSCopying协议,那么您需要扩展或子类化该类,并添加一个copy(with:)方法:

extension UIView: NSCopying {
    public func copy(with zone: NSZone? = nil) -> Any {
        return UIView(frame: self.frame)
    }
}

var aView = UIView(frame:CGRect(x: 0, y: 0, width: 100, height: 100))
var bView = aView.copy() as! UIView

aView.tag = 5
bView.tag // 0
aView.tag // 5

注意:复制UIView的代码示例非常简单,并假定“复制”仅是一个相同大小的视图,而在实际使用中,复制通常会包含子视图等更复杂的东西。


4
实际上,最简单的方法是这样做:var arr2:[myObject] = Array(arr1)
附言:感谢所有人的建议。

让updatedMyArray:[MyObject] = Array(self.MyArray)对我不起作用。 - Shahid Aslam

0
你可以通过创建一个计算属性来实现这一点。然后使用lazy load将其声明为类变量。
lazy var secondArray :[myObject] = { return firstArray }()

现在如果你需要第二个数组,它会给你第一个数组


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