2015-05-26 11 views
10

Le enumerazioni Swift hanno sia valori associati sia valori non elaborati. Ma i casi d'uso di questi valori non mi sono chiari. Quindi sarei davvero grato se qualcuno potesse spiegare la differenza tra i valori associati e grezzi, un esempio sarebbe molto utile.Differenza tra valori associati e grezzi nelle enumerazioni rapide

+0

http://www.allinterview.com/showanswers/191460/in-swift-enumerations-s-difference-between-raw-values -and-associated-values.html – sasquatch

risposta

13

I valori non elaborati si riferiscono a quando ogni caso nell'enumerazione è rappresentato da un valore impostato in fase di compilazione. La sono simili alle costanti, cioè

let A = 0 
let B = 1 

è simile a:

enum E: Int { 
    case A // if you don't specify, IntegerLiteralConvertible-based enums start at 0 
    case B 
} 

Quindi, A ha un valore grezzo fisso di 0, B di 1 ecc impostato al momento della compilazione. Devono essere tutti dello stesso tipo (il tipo del valore grezzo è per l'intero enum, non per ogni singolo caso). Possono essere solo stringhe, caratteri o numeri letterali-convertibili. E devono essere tutti distinti (non è possibile che due enumerazioni abbiano lo stesso valore grezzo).

valori associati sono più come variabili associate con uno dei casi enumerazione:

enum E { 
    case A(Int) 
    case B 
    case C(String) 
} 

Qui, A ora ha associato un Int che può contenere qualsiasi valore intero. B d'altra parte, non ha alcun valore associato. E C ha associato String. I tipi associati possono essere di qualsiasi tipo, non solo stringhe o numeri.

Qualsiasi valore determinato di tipo E sarà sempre e solo contenere uno dei tipi associati, cioè o un Int se l'enumerazione è un A, o un String se l'enumerazione è un C. Ha solo bisogno di spazio sufficiente per il più grande dei due. Tipi come questo sono a volte indicati come "unioni discriminate": un'unione è una variabile che può contenere più tipi diversi, ma tu sai (dal caso enum) quale tiene.

Possono anche essere generici. L'esempio più comune dei quali è Optional, che è definito così:

enum Optional<T> { 
    case .Some(T) 
    case .None 
} 
+0

se è come: 'caso A (orderNumber: Int, account: String)' quale sarebbe il tipo associato allora? una tupla su Int, String? – Honey

+0

@Honey "Definire un tipo di enumerazione denominato Barcode, che può assumere un valore di upc con un valore associato di tipo (Int, Int, Int, Int) o un valore di qrCode con un valore associato di tipo String." https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Enumerations.html – Sakshi

Problemi correlati