array.last和一般嵌套数组复制/访问变异混淆

时间:2015-03-21 21:56:51

标签: swift

(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'请求'赋予可变对象的转换 - 是否打算这样做?

基本上我想将数组附加到数组,然后将对象添加到最后添加的数组中,而不是一直使用索引。

1 个答案:

答案 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>: - (