(XCode 6.2)基本上我有一个类实例数组的数组。我可以毫无问题地改变内部数组的内容,如果我通过[index]
访问它,但如果我首先将它分配给一个变量,内部数组的内容不会被改变(它首先被复制 - 显然)。使用树结构/算法时,通过索引访问通常不是很容易阅读。那么我该如何以“正确”的方式解决以下情况呢?
简化问题域:
class ZNeuron {
}
class ZNet {
var layers : [[ZNeuron]] = []
required init() {
self.construct()
}
func construct() {
for index in 0...3 {
self.layers.append([ZNeuron]())
for _ in 0...4 {
var lastInserted = self.layers.last! // 1.
lastInserted.append(ZNeuron()) // 2.
//self.layers.last!.append(ZNeuron()) // 3.
//self.layers[index].append(ZNeuron()) // 4.
println(lastInserted)
}
}
println(self.layers)
}
}
var mnet = ZNet()
1.结合2.我想访问最后插入的数组并添加到它。它不会添加到最后插入的数组但是?复制它并向它提供帮助。 3.根本不会编译。 4.虽然工作正常但这让我想到,必须有其他方法来访问这个变量/引用。我可能不想写那个x次。在3的情况下,我认为optinal默认情况下被解包为常量,并且var
i'请求'赋予可变对象的转换 - 是否打算这样做?
基本上我想将数组附加到数组,然后将对象添加到最后添加的数组中,而不是一直使用索引。
答案 0 :(得分:0)
与复制数组时的Obj-C不同,您不会复制引用,而是复制存储在数组中的数据(尽管它将是懒惰的)。如果您希望将更改的数据重新保留在原始数组中,则还需要将更改的条目复制回来。
将以下内容粘贴到Playground中,您将看到:
var a = [1, 2, 3]
var b = a
a1[1] = 9
b[1] // still 2
编辑:如果你真的需要引用,你必须将数组包装在一个类中。这样Swift就会复制对象的引用。
class A {
var props = [String]()
init(p:String) { props.append(p) }
}
var a1:[A] = [A(p: "1"), A(p: "2"), A(p: "3")]
println(a1[0].props)
var b = a1
println(b[0].props)
a1[0].props.append("two")
println(b[0].props)
注意:上面的操作在Playground中崩溃了,但在调试器的编译源中运行。 Swift是Alpha>: - (