Swift - Transmite Int a la enumeración: Int

134

Soy muy nuevo en Swift (comencé esta semana) y estoy migrando mi aplicación desde Objective-C. Básicamente tengo el siguiente código en Objective-C que funciona bien:

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];
}

Al traducirlo a Swift, hice lo siguiente:

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)
}

Al hacer eso, obtengo el error:

'Int' no es convertible a 'MyTimeFilter'

No sé si mi enfoque (usando la propiedad de etiqueta) es el mejor, pero de todos modos necesito hacer este tipo de casting en diferentes lugares de mi aplicación. ¿Alguien tiene una idea de cómo deshacerse de este error?

¡Gracias!

Marcos Duarte
fuente
2
También tenga en cuenta que en lugar de (sender as UIButton), simplemente puede cambiar la firma del método para tomar en UIButtonlugar de AnyObject.
Ben Leggiero

Respuestas:

240

Use el rawValueinicializador: es un inicializador generado automáticamente para enums.

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

ver: El lenguaje de programación Swift § Enumeraciones


NOTA: esta respuesta ha cambiado. La versión anterior de Swift usa el método de clase fromRaw()para convertir valores sin procesar en valores enumerados.

Jeffery Thomas
fuente
También tenga en cuenta que si la etiqueta del remitente no corresponde a un valor de enumeración, esto provocará un bloqueo debido a !.
Ben Leggiero
2
Yo diría que estrellarse es la mejor manera de atrapar un error en este caso.
XY
0

Swift 5

@IBAction func selectFilter(sender: AnyObject) {
    timeFilterSelected = MyTimeFilter(rawValue: sender.tag)
 }
Alok
fuente
No respondiste la pregunta en absoluto, en lugar de comentar que no sabes por qué alguien votó en contra, revisa la pregunta y tu respuesta nuevamente por qué alguien votó en contra. Bueno, yo también tengo que votar en contra.
Renetik
0

elaborando la respuesta de Jeffery Thomas. para estar seguro coloque una declaración de guardia desenvuelva el yeso antes de usarlo, esto evitará accidentes

   @IBAction func selectFilter(sender: AnyObject) {
     guard let filter = MyTimeFilter(rawValue: (sender as UIButton).tag) else { 
        return
    }
        timeFilterSelected = filter
     }
Abraham Gonzalez
fuente