Swift - Cast Int in enum: Int


134

Sono molto nuovo su Swift (iniziato questa settimana) e sto migrando la mia app da Objective-C. Ho sostanzialmente il seguente codice in Objective-C che funziona bene:

typedef enum : int {
    MyTimeFilter1Hour = 1,
    MyTimeFilter1Day = 2,
    MyTimeFilter7Day = 3,
    MyTimeFilter1Month = 4,
} MyTimeFilter;

...

- (void)selectFilter:(id)sender
{
    self.timeFilterSelected = (MyTimeFilter)((UIButton *)sender).tag;
    [self closeAnimated:YES];
}

Durante la traduzione in Swift, ho fatto quanto segue:

enum MyTimeFilter : Int {
    case OneHour = 1
    case OneDay = 2
    case SevenDays = 3
    case OneMonth = 4
}

...

@IBAction func selectFilter(sender: AnyObject) {
    self.timeFilterSelected = (sender as UIButton).tag as MyTimeFilter
    self.close(true)
}

In questo modo, ottengo l'errore:

'Int' non è convertibile in 'MyTimeFilter'

Non so se il mio approccio (usando la proprietà tag) sia il migliore, ma comunque devo fare questo tipo di casting in diversi punti della mia app. Qualcuno ha un'idea di come sbarazzarsi di questo errore?

Grazie!


2
Si noti inoltre che, al posto di (sender as UIButton), è possibile modificare la firma del metodo solo per prendere in UIButtoninvece di AnyObject.
Ben Leggiero,

Risposte:


240

Usa l' rawValueinizializzatore: è un inizializzatore generato automaticamente per enums.

self.timeFilterSelected = MyTimeFilter(rawValue: (sender as UIButton).tag)!

vedi: Il linguaggio di programmazione Swift § Enumerazioni


NOTA: questa risposta è cambiata. La versione precedente di Swift utilizza il metodo class fromRaw()per convertire valori grezzi in valori enumerati.


Si noti inoltre che se il tag del mittente non corrisponde a un valore enum, ciò causerà un arresto anomalo a causa di !.
Ben Leggiero,

2
Direi che il crash è il modo migliore per catturare un bug in questo caso.
XY

0

Swift 5

@IBAction func selectFilter(sender: AnyObject) {
    timeFilterSelected = MyTimeFilter(rawValue: sender.tag)
 }

Non hai risposto affatto alla domanda, invece di commentare che non sai perché qualcuno ha votato a fondo, controlla la domanda e la tua risposta ancora perché qualcuno ha votato verso il basso. Beh, devo votarlo anche io.
Renetik,

0

elaborando la risposta di Jeffery Thomas. per essere sicuro di mettere una dichiarazione di guardia scartare il cast prima di usarlo, questo eviterà gli arresti anomali

   @IBAction func selectFilter(sender: AnyObject) {
     guard let filter = MyTimeFilter(rawValue: (sender as UIButton).tag) else { 
        return
    }
        timeFilterSelected = filter
     }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.