間接有效載荷

通常,列舉不能遞迴(因為它們需要無限儲存):

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>)
}