Swift Language Carichi utili indiretti

Esempio

Normalmente, le enumerazioni non possono essere ricorsive (perché richiederebbero una memoria infinita):

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

La parola chiave indirect rende l'enumerazione del carico utile con uno strato di riferimento indiretto, anziché memorizzarlo in linea. Puoi utilizzare questa parola chiave in un singolo 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 funziona anche sull'intero enum, rendendolo comunque indiretto quando necessario:

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