2017-09-05 10 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 parentNodes: [Node?]

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

var parentNode: Node?を変更することができますしかし、これは悪い習慣です。あなたはもはや木はなく、グラフを持っています。

0

Modulesは列挙型であるため、値です。 Modulesが本当に価値の意味論を持っているならば、あなたがする必要があるのは2つの異なる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

はい、これを解決する1つの方法は、2つの別個の 'Node(.4)'を持つことですが、私の 'enum'構造体にこれらの新しいenumメンバーがあふれてしまうことを意味します。新しいインスタンス? –

+0

これを解決するには十分な情報がありません。私は問題が何であるか分かりません。なぜ列挙事件の洪水があるでしょうか?前に.1、.2、.3、.4以上はありません。同じModule値を持つ2つのノードの動作がその親によって異なる場合、その情報をNodeの状態とロジックに何らかの形で追加する必要がありますが、構造には影響しません(わかる限り)。 –

+0

@BrendonCheung、私は私の答えがあなたの質問を満たすと確信しています。そうでない場合は教えてもらえますか? – ScottyBlades

関連する問題