首页 > 解决方案 > 在不修改原始节点的情况下编写 Dijkstra 算法

问题描述

我有一个使用我选择的语言的 Dijkstra 算法的工作版本 - 在这种情况下是 Swift。

您可能知道,该算法要求您在节点上放置临时标签 - 但是否可以在不更改原始类的情况下实现。作为参考,这里是一个缩减的节点类,但这个问题与语言无关,因为我只想知道如何在不更改原始类的情况下实现它。

class Node: Hashable {
    var nodes = [Int:[Int]]()
    var children = [Node]()
}

标签: swiftalgorithm

解决方案


一种半hacky的解决方案是使用关联的对象:

fileprivate var labelKey: UInt8 = 0
extension Node {
    var label: Int {
        get {
            return objc_getAssociatedObject(self, &labelKey) as? Int ?? 0
        }
        set {
            objc_setAssociatedObject(self, &labelKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
        }
    }
}

这样你就不会改变原来的类。


推荐阅读