2015-01-20 8 views
17

In C si potrebbe rendere il vostro enumerazioni hanno questaSwift enum casi multiple con lo stesso valore di

typedef enum _Bar { 
    A = 0, 
    B = 0, 
    C = 1 
} Bar; 

a Swift Voglio fare l'equivalente. Tuttavia il compilatore si lamenta che non è unico. Come faccio a dire che voglio che due casi abbiano lo stesso valore?

enum Bar : Int { 
    case A = 0 
    case B = 0 //Does not work 
    case C = 1 
} 

Ive ha provato

case A | B = 0 

e

case A, B = 0 

Ma non sembra funzionare come voglio io. Apprezzo qualsiasi aiuto.

risposta

13

Swift non supporta i valori duplicati. (o "alias" semanticamente) Se non ti dispiace, puoi imitarlo usando qualcosa di simile.

enum Foo: Int { 
    case Bar = 0 

    static var Baz:Foo { 
     get { 
      return Bar 
     } 
    } 
    static var Jar:Foo { 
     get { 
      return Foo(rawValue: 0)! 
     } 
    } 
} 
+0

Oppure, poiché le proprietà sono implicite per avere un codice getter se non è specificato né 'get' né' set', è possibile accorciarle fino a 'static var Baz: Foo {return Bar}' e 'static var Jar: Foo {return Foo (rawValue: 0)! } '. –

+0

Oppure, sembra in Swift 3, le proprietà delle classi memorizzate funzioneranno così semplicemente 'statico lasciare Baz = Foo.Bar' e' static lascia Jar = Foo (rawValue: 0)! '. –

5

Swift non consente agli elementi di un enum di condividere valori. Dalla documentazione sull'enumerazione sotto la voce "Valori grezzi" (enfasi mia):

I valori non elaborati possono essere stringhe, caratteri o qualsiasi numero intero o tipo di numero in virgola mobile. Ogni valore non elaborato deve essere univoco all'interno della relativa dichiarazione di enumerazione.

+2

È sempre possibile creare i membri della classe costanti per costruire valori alias se è questo ciò che si vuole, possono essere utilizzate nei costruttori e le assegnazioni, ma non in istruzioni switch. –

3

Non sono sicuro che sia possibile. Quanto segue è preso da Apple.

"A differenza di C e Objective-C, ai membri di enumerazione Swift non viene assegnato un valore intero predefinito quando vengono creati. Nell'esempio CompassPoints sopra, Nord, Sud, Est e Ovest non equivalgono implicitamente a 0, 1, 2 e 3. Invece, i diversi membri di enumerazione sono valori completi a tutti gli effetti, con un tipo di CompassPoint definito in modo esplicito. "

Estratto da: Apple Inc." The Swift Programming Language. "IBooks. https://itunes.apple.com/us/book/swift-programming-language/id881256329?mt=11

Poiché i membri di enumerazione non equivalgono in modo implicito a 0, 1, ecc., Il compilatore considera ciascuno un valore univoco. Quando si tenta di duplicarlo, il compilatore si lamenta perché è già stato creato.

C'è qualche motivo per cui è necessario duplicare il valore?

+0

Sì, desidero utilizzare le enumerazioni per rappresentare i percorsi dell'indice. Diverse sezioni avranno un enum e i nomi delle righe saranno associati all'indice delle righe. L'indice di riga può avere lo stesso valore ma avere sezioni diverse. – DerrickHo328

+1

Sembra che tu voglia una struct, non un enum. –

3

Ecco un altro modo di ottenere intorno ad esso:

enum Animal { 

    case dog 
    case cat 
    case mouse 
    case zebra 

    var description: String { 
    switch self { 
    case .dog: 
     return "dog" 

    case .cat: 
     return "dog" 

    case .mouse: 
     return "dog" 

    case .zebra: 
     return "zebra" 

    default: 
     break 
    } 
    } 
} 
0

ho incontrato lo stesso problema sul caso multipla con lo stesso valore. Dopo google questo problema, preferisco la seguente soluzione con computed properties di enum, which come from this post.


Swift enum properties

Problemi correlati