web-dev-qa-db-fra.com

Swift - Cast Int en enum: Int

Je suis très nouveau pour Swift (commencé cette semaine) et je migre mon application depuis Objective-C. J'ai essentiellement le code suivant dans 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 procédé comme 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 je dois quand même faire ce type de casting à différents endroits de mon application. Quelqu'un at-il une idée de la façon de se débarrasser de cette erreur?

Merci!

126
Marcos Duarte

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

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

voir: Le Swift Langage de Programmation § Énumérations


REMARQUE: cette réponse a changé. Les versions antérieures de Swift utilisent la méthode de classe fromRaw() pour convertir les valeurs brutes en valeurs énumérées.

222
Jeffery Thomas

Utilisation de Enum pour la comparaison comme ci-dessous:

enum LoanType: Int {
    case FHA , VA, CONS, CASH
}
var loanType = LoanType.FHA

Comparaison:

if loanType == .FHA
     {
      print("FHA")
     }

Pour changer de valeur:

loanType = .CASH
1
Alok