2017-09-05 82 views
0

我正在創建一個tableView菜單,最終導致用戶輸入某個參數,然後輸出結果。在UITableView中快速複製葉子的樹結構

菜單由多個頁面組成,根據用戶選擇的內容,它會給出不同的用戶輸入。這與iPhone設置非常相似。

現在,我的菜單模型的方法是使用一個樹狀結構:

class Node { 

    let value: Modules 

    var parentNode: Node? 
    var childenNode = [Node]() 

    var childCount: Int { 
     return childenNode.count 
    } 

    func appendNode(node: Node) { 
     childenNode.append(node) 
     node.parentNode = self 
    } 

    func isLeaveNode() -> Bool { 
     return childenNode.isEmpty 
    } 

    init(module: Modules) { 
     self.value = module 
    }    
} 

這是非常簡單和典型樹數據結構。我的問題是這樣的,可能有重複的節點,意味着父節點將被覆蓋。例如,給定的結構是這樣的:

   [1] 
     / \ 
     [2]   [3] 
    /    \ 
    [4]     [4] 

如果我這棵樹與我的代碼模型,它看起來就像這樣:

let node1 = Node(.1) 
let node2 = Node(.2) 
let node3 = Node(.3) 
let node4 = Node(.4) 

node1.appendNode(node2) 
node1.appendNode(node3) 

node2.appendNode(node4) 
node3.appendNode(node4) 

由於節點4的外觀獨特,因此node4的父項將被覆蓋,並且父項現在爲node3。而node2node3應共享相同的葉子。我應該如何更改我的代碼,以便給定的葉節點可以有多個父節點?

附加信息:Modulesenum。這個問題可以通過創建更多的enum成員來解決,但是解決問題還有其他方法嗎?

歡迎任何建議!

謝謝!

+0

您是否使用模塊的枚舉? – ScottyBlades

+0

是的,我是。這些模塊是枚舉 –

+0

你問:「我應該如何更改我的代碼,以便我的葉節點可以有不同的父母?」但是具有相同父節點的唯一節點是node2和node3。你不想讓node2和node3共享父級?爲什麼不想要這個? – ScottyBlades

回答

0

您可以更改

var parentNode: Node?var parentNodes: [Node?]

func appendNode(node: Node) { 
     childenNode.append(node) 
     node.parentNodes.append(self) 
    } 

然而,這是不好的做法。你將不再擁有一棵樹,而是一張圖。

0

看來Modules是一個枚舉,因此是一個值。如果Modules確實具有價值語義,那麼您只需創建兩個不同的Node(.4)。每個都有一個單獨的父母。不要保留node4變量,而是相信你的樹結構並放心地導航。

node2.appendNode(Node(.4)) 
node3.appendNode(Node(.4)) 

您需要重新思考我們的課程以及如何更直觀地構建樹。也許沿着這條線

init(_ module: Module, children: [Node] = [Node]()) { 
    self.value = module 
    self.children = children 
    foreach child in self.children { 
    child.parent = self 
    } 
} 

現在你可以像這樣初始化你的樹了。

let root = 
     Node(.1, children: 
     [ 
     Node(.2, children: [Node(.4)]), 
     Node(.3, children: [Node(.4)]) 
     ]) 
+0

是的,解決這個問題的一種方法是使用兩個不同的'Node(.4)',但這意味着我的enum結構將被這些新的枚舉成員充斥,還有另一種方法可以實現這一點,而無需創建新的實例? –

+0

我們沒有足夠的信息來解決這個問題。我不確定問題是什麼。爲什麼會有大量的枚舉案例?之前沒有比.1,.2,.3和.4更多的東西。如果具有相同模塊值的兩個節點的行爲取決於其父節點的不同,那麼您需要將該信息添加到節點的狀態和邏輯中,但不影響結構(據我們所知)。 –

+0

@BrendonCheung,我很確定我的回答滿足你的問題。如果不是,你能告訴我嗎? – ScottyBlades