DevPrep

Все темы › Язык Swift

Ключевое слово в Swift для создания рекурсивных перечислений?

Junior PRO

Суть

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

Потренируйтесь перед собеседованием

В DevPrep эти ответы превращаются в задачи на минуту: что напечатает код, найди баг, пробное собеседование. По задаче в день.

Скачать DevPrep в App Store