我正在创建带有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
。而node2
和node3
应该共享相同的叶子。我应该如何更改代码,以便任何给定的叶节点可以有多个父节点?附加信息:
Modules
是enum
。仅创建更多的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)])
])