Swift - 如何复制包含引用类型的数组

时间:2015-05-06 02:08:51

标签: arrays swift

我正在尝试复制数组及其值。为什么两个数组都引用相同的变量?你可以在Playground尝试这个。

var view = UIView()
view.tag = 1

var a = [UIView]()
var b = [UIView]()

a.append(view)

b = a
view.tag = 2

a[0].tag // value is 2
b[0].tag // value is 2?

2 个答案:

答案 0 :(得分:4)

由于Swift中的Array是值类型,因此当您复制它时将创建一个单独的副本。但由于UIView是引用类型而您的数组包含UIViews,因此复制时它们指向相同的内存位置或相同的引用。您的数组ab即使是两个单独的数组并且每个数组包含一个对象,它们也会指向相同的位置。当您将标签号分配为2时,它只是覆盖该内存位置的旧号码(参考)。

答案 1 :(得分:2)

如果您有复制UIView的功能,那么只需使用map

var a = [UIView]()
var b = map (a) { $0.copyTheView() }

在您的情况下,数组ab虽然不同,但却指向相同的视图。因此,如果您修改a中的一个引用,即变量view,那么b中的引用也会看到修改。