我创建了一个树数据结构:
struct BKTree:
var root: Optional[BKTreeNode]
struct BKTreeNode(TestableCollectionElement):
var text: String
var parent_distance: Int
var children: List[BKTreeNode]
我已向其中添加了节点。现在我想通过迭代其子节点来搜索节点:
nodes_to_process = List[UnsafePointer[BKTreeNode]](
UnsafePointer.address_of(self.root.value())
)
while len(nodes_to_process) > 0:
current_node_ref = nodes_to_process.pop()
current_node_distance_to_query = levenshtein_distance(
current_node_ref[].text, query
)
for child in current_node_ref[].children:
if (within_distance):
nodes_to_process.append(UnsafePointer.address_of(child[]))
如您所见,我在这里使用了不太喜欢的。我尝试使用,但无法弄清楚如何正确设置生命周期。如果我使用:
UnsafePointerPointer
nodes_to_process = List(Pointer.address_of(self.root.value()))
call to 'append': method argument #0 cannot be converted from 'Pointer[0, BKTreeNode, self.root.value.children, 0]' to 'Pointer[0, BKTreeNode, self.root.value, 0]'。
有没有一种惯用的方法可以正确地做到这一点?我试过了,Arc但这似乎使搜索速度大大减慢。我使用Pointers 来避免复制节点。首先,这是正确的解决方法吗?