Swift - Cast Int en enum: Int

134

Je suis très nouveau sur Swift (j'ai commencé cette semaine) et je migre mon application d'Objective-C. J'ai essentiellement le code suivant en Objective-C qui fonctionne 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];
}

Lors de la traduction en Swift, j'ai fait ce qui suit:

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

En faisant cela, j'obtiens l'erreur:

'Int' n'est pas convertible en 'MyTimeFilter'

Je ne sais pas si mon approche (en utilisant la propriété tag) est la meilleure, mais de toute façon je dois faire ce genre de casting à différents endroits de mon application. Quelqu'un a-t-il une idée de la façon de se débarrasser de cette erreur?

Merci!

Marcos Duarte
la source
2
Notez également qu'au lieu de (sender as UIButton), vous pouvez simplement changer la signature de la méthode pour prendre un UIButtonau lieu de AnyObject.
Ben Leggiero

Réponses:

240

Utilisez l' rawValueinitialiseur: c'est un initialiseur généré automatiquement pour enums.

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

voir: Le langage de programmation Swift § Enumérations


REMARQUE: cette réponse a changé. La version antérieure de Swift utilise la méthode de classe fromRaw()pour convertir les valeurs brutes en valeurs énumérées.

Jeffery Thomas
la source
Notez également que si la balise de l'expéditeur ne correspond pas à une valeur d'énumération, cela provoquera un plantage en raison de l'extension !.
Ben Leggiero
2
Je dirais que le crash est le meilleur moyen d'attraper un bug dans ce cas.
XY
0

Swift 5

@IBAction func selectFilter(sender: AnyObject) {
    timeFilterSelected = MyTimeFilter(rawValue: sender.tag)
 }
Alok
la source
Vous n'avez pas du tout répondu à la question, au lieu de dire que vous ne savez pas pourquoi quelqu'un a voté contre, vérifiez la question et votre réponse à nouveau pourquoi quelqu'un a voté contre. Eh bien, je dois aussi voter contre.
Renetik
0

élaborer sur la réponse de Jeffery Thomas. pour être sûr, placez une déclaration de garde déballer le plâtre avant de l'utiliser, cela évitera les plantages

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