如何在Swift中定义递归数据结构

时间:2015-09-24 21:48:25

标签: swift

我试图在Swift中创建类似BNF的DSL。 在Scala中,gll-combinators有一个很好的方法:

lazy val expr: Parser[Any] = (
    "(" ~ expr ~ ")" ^^ { _ + _ + _ }
  | ""
)

这会创建一个引用自己的解析器。

当我尝试在Swift中执行相同操作时(在类中使用lazy var或在函数中使用@autoclosure),我会在其自己的初始值中使用变量&#39 ;错误。

在一个简单的例子中

class Node {
    private var node: Node
    init(node: Node) { self.node = node }
}

我想创建一个节点,其成员node指向self

lazy var node = Node(node) // error

有办法吗?

1 个答案:

答案 0 :(得分:0)

所以你想定义一个属性引用self的类?

也许是这样的?

class Node {
    private var node: Node!

    init(node: Node) {
        self.node = node
    }

    init() {
        self.node = self
    }
}

现在你可以写:

let node = Node()

我必须使node属性可选才能使其正常工作。

希望这有帮助。