2015-07-03 81 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