Ключевое слово в Swift для создания рекурсивных перечислений?
Суть
indirect. Enum — value-тип фиксированного размера, а рекурсивный case содержал бы сам себя, то есть имел бы бесконечный размер. indirect говорит компилятору хранить payload такого case в куче (boxing) и держать в enum только ссылку. Можно пометить отдельный case или весь enum.
indirect enum Expr {
case number(Int)
case add(Expr, Expr)
case multiply(Expr, Expr)
}
func eval(_ e: Expr) -> Int {
switch e {
case .number(let n): n
case .add(let l, let r): eval(l) + eval(r)
case .multiply(let l, let r): eval(l) * eval(r)
}
}
let expr = Expr.add(.number(2), .multiply(.number(3), .number(4)))
print(eval(expr)) // 14
enum Tree<T> {
case leaf
indirect case node(Tree, T, Tree) // indirect только у одного case
}
Продолжение ответа с кодом и уточняющими вопросами интервьюера — в приложении DevPrep.
Полный ответ — в DevPrep