我正在创建一个带有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的外观是 NOT 唯一,因此将覆盖node4
的父级,而父级现在为node3
。然而,node2
和node3
应该共享相同的叶子。我应该如何更改我的代码,以便任何给定的叶节点可以有多个父节点?
其他信息:Modules
是enum
。只需创建更多enum
成员就可以轻松解决这个问题,但还有其他方法可以解决问题吗?
欢迎任何建议!
谢谢!
答案 0 :(得分:0)
您可以更改
var parentNode: Node?
至var parentNodes: [Node?]
func appendNode(node: Node) {
childenNode.append(node)
node.parentNodes.append(self)
}
然而,这是不好的做法。您将不再拥有树,而是图表。
答案 1 :(得分: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)])
])