我正在创建带有tableView的菜单,最终会导致用户输入某个参数,然后输出结果。

该菜单由几页组成,根据用户的选择,它将提供不同的用户输入。它与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成员即可轻松解决此问题,但是还有其他解决方法吗?

欢迎任何建议!

谢谢!

最佳答案

看来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)])
      ])

10-08 09:32
查看更多