间接有效载荷

通常,枚举不能递归(因为它们需要无限存储):

enum Tree<T> {
    case leaf(T)
    case branch(Tree<T>, Tree<T>)  // error: recursive enum 'Tree<T>' is not marked 'indirect'
}

所述 indirect 关键字使得枚举存储其有效载荷与间接层,而不是将其存储内联。你可以在单个案例中使用此关键字:

enum Tree<T> {
    case leaf(T)
    indirect case branch(Tree<T>, Tree<T>)
}

let tree = Tree.branch(.leaf(1), .branch(.leaf(2), .leaf(3)))

indirect 也适用于整个枚举,在必要时使任何情况间接:

indirect enum Tree<T> {
    case leaf(T)
    case branch(Tree<T>, Tree<T>)
}