Swift Language Cabida indirecta


Ejemplo

Normalmente, las enumeraciones no pueden ser recursivas (porque requerirían almacenamiento infinito):

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

La palabra clave indirect hace que la enumeración almacene su carga útil con una capa de direccionamiento indirecto, en lugar de almacenarla en línea. Puede utilizar esta palabra clave en un solo caso:

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 también funciona en toda la enumeración, haciendo que cualquier caso sea indirecto cuando sea necesario:

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