在 Swift 中,我可以使用光标/指针来导航具有多种类型子项的 n 元链接树吗?

Can I use a cursor/pointer to navigate an n-ary linked tree with children of multiple types in Swift?

提问人:Morpheu5 提问时间:12/9/2022 更新时间:12/9/2022 访问量:30

问:

我在 Swift 中工作,我有以下代码(请耐心等待):

class Node {
    var parent: Node? = nil
    var name: String = ""
    private var _size: Int = 0
    var size: Int { get { return _size } }
    init(name: String, size: Int = 0) {
        self.name = name
        self._size = size
    }
}

class Directory: Node {
    private var _children: [Node] = []
    var children: [Node] {
        get { return _children }
        set(children) {
            _children = children
            for child in _children {
                child.parent = self
            }
        }
    }
    override var size: Int {
        get { return children.map { $0.size }.reduce(0, +) }
    }

    func append(node: Node) {
        _children.append(node)
        node.parent = self
    }

    func remove(name: String) {
        if let i = _children.firstIndex(where: { $0.name == name }) {
            _children[i].parent = nil
            _children.remove(at: i)
        }
    }

    func remove(node: Node) {
        self.remove(name: node.name)
    }

    func findBy(name: String) -> Node? {
        if let i = _children.firstIndex(where: { $0.name == name }) {
            return _children[i]
        } else {
            return nil
        }
    }
}

class File: Node {}

因此,它对一棵树进行了建模,其中包含一个可以是 s 或 s 的 s 数组,该数组在构建它时与预期一样工作。以有状态的方式导航它有点棘手。Directory: NodeNodeFileDirectory

通常,在我以前的 C/C++ 生活中,我会有一个用来做类似的事情,这不是最漂亮的解决方案,但它对我的用例来说效果很好,如果“myFancyName”确实是一个,我几乎可以根据我的用例保证。Directory *pwdpwd = (Directory *)pwd->findBy("myFancyName")Directory

所以我继续做了一个,但这意味着我不能做,因为该方法返回一个.所以我做了,但这迫使我四处走动,一直我需要从类中调用一个方法,这有点有效,但有点难看。var pwd: Directory?pwd = pwd.findBy(name: "myFancyname")Node?pwd: Node?(pwd as! Directory)Directory

有没有更好的解决方案?

Swift 指针 数据结构 转换

评论

0赞 Joakim Danielson 12/9/2022
让 Node 成为协议怎么样?
0赞 Morpheu5 12/9/2022
我想我可以,但是返回类型是什么?findBy
0赞 Joakim Danielson 12/9/2022
这将是协议
0赞 Morpheu5 12/11/2022
嗯,这很有帮助,但它需要相当多的重写。如果你不介意添加这个作为答案,我会接受的!

答: 暂无答案