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!


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.


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

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
     }
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.