Sto cercando di capire i limiti esatti sull'enumerazione con valori associati generici in Swift.Qual è la limitazione esatta dei valori associati generici nelle enumerazioni Swift?
Si potrebbe pensare che siano supportati, poiché Optional
è un tipo simile. Qui è il codice definisce Optional
nella libreria standard Swift:
enum Optional<T> : Reflectable, NilLiteralConvertible {
case None
case Some(T)
// ...
}
Sembra che il membro caso Some
ha un valore associato di tipo variabile T
, giusto?
Tuttavia, è menzionato nel libro Functional Programming in Swift (p 87), che tali tipi non sono supportati:
Vorremmo definire una nuova enumerazione che è generico nel risultato associato con successo:
enum Result<T> { case Success(T) case Failure(NSError) }Sfortunatamente, i valori associati generici non sono supportati dal compilatore Swift corrente.
E infatti, se si digita lo snippet nel compilatore, si riceve un errore (error: unimplemented IR generation feature non-fixed multi-payload enum layout
).
Quindi cosa sta succedendo qui? È solo che non è supportato in generale, ma è supportato per Optional
come caso speciale? C'è un modo per vedere come Optional riceve questo supporto speciale? O se anche altri tipi di libreria standard ottengono un supporto speciale?
Sembra che un valore * generico associato sia possibile solo se è il valore associato * * *. –
Oh giusto. Quindi, nell'errore, "multi-payload" si riferisce al fatto che esiste più di un valore associato. E che dire di "non fisso"? Direi che ciò si riferisce al fatto che la dimensione di 'T' è indeterminata, poiché se si tratta di un tipo non di classe, non si può certamente sapere che abbia le dimensioni di un puntatore a oggetti. – algal