2015-07-03 66 views
1

分配可选考虑下面的代码:斯威夫特:如何通过参考

class Node { 
     var value: Int 
     var left: Node? 
     var right: Node? 
     init (value: Int) { 
      self.value = value 
     } 
    } 

root = Node(value: 200) 

然后将下面的代码分配一个新的节点root.left:

var temp1 = root 
    temp1!.left = Node(value: 400) 

但下面不分配一个新的节点root.right:

var temp2 = root!.right 
    temp2 = Node(value: 300) 

大概在最后的代码片段根!.right被赋值给temp2,如果是的话,那么然后有没有一种通过引用分配它的方法?

回答

1

这实际上与可选项无关 - 如果属性Node.leftNode.right不是可选项,则会发生相同的行为。相反,这与Swift类的属性有关。

在你以前的例子,你都指向temp1相同的类实例root点。因此,roottemp1Node是同一个实例,因此当您将属性设置为一个属性时,它会在您从另一个属性中获取时更改。

在你的后一个例子中,你得到的值为root!.right(目前为零)并将其设置为一个新变量temp2。您正在创建一个新的类实例,因此最终会生成两个不同的类实例。当您分配到root.right时,它将不会对temp2(反之亦然)产生影响。

+0

有没有办法让temp2成为一个引用,所以它有可能遍历数据结构,例如:for(var temp = root; temp!= nil; temp = value Gruntcakes

+0

嗯我不知道你为什么需要一个引用类型,但尝试使'节点'结构,而不是一个类。 – BradzTech

+1

因为如果它的参考然后不temp2指向原来的而不是它的副本? – Gruntcakes