Я намагаюся створити BNF-подібний DSL у Swift. У Скалі gll-комбінатори має приємний підхід:
lazy val expr: Parser[Any] = (
"(" ~ expr ~ ")" ^^ { _ + _ + _ }
| ""
)
Це створює синтаксичний синтаксичний аналізатор, який посилається сам.
Коли я намагаюсь зробити те ж саме в Swift (використовуючи a lazy var
в класі або @autoclosure
в функції), я отримую помилку "Змінні використані в межах власного початкового значення".
У простому прикладі
class Node {
private var node: Node
init(node: Node) { self.node = node }
}
Я хочу створити вузол з його учасником node
вказуючи на self
.
lazy var node = Node(node) // error
Чи є шлях навколо?
Відповіді:
0 для відповіді № 1Таким чином, ви хочете визначити клас, де властивість має посилання self
?
Може, щось подібне?
class Node {
private var node: Node!
init(node: Node) {
self.node = node
}
init() {
self.node = self
}
}
Тепер ви можете написати:
let node = Node()
Мені довелося зробити node
майно факультативно, щоб зробити цю роботу.
Сподіваюся, це допоможе.