Swift - Elenco Int em enum: Int


134

Sou muito novo no Swift (comecei esta semana) e estou migrando meu aplicativo do Objective-C. Eu tenho basicamente o seguinte código no Objective-C que funciona bem:

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

Ao traduzi-lo para Swift, fiz o seguinte:

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

Ao fazer isso, recebo o erro:

'Int' não é conversível em 'MyTimeFilter'

Não sei se minha abordagem (usando a propriedade tag) é a melhor, mas, mesmo assim, preciso fazer esse tipo de transmissão em lugares diferentes no meu aplicativo. Alguém tem uma idéia de como se livrar desse erro?

Obrigado!


2
Observe também que, em vez de (sender as UIButton), você pode simplesmente alterar a assinatura do método para obter um em UIButtonvez de AnyObject.
Ben Leggiero

Respostas:


240

Use o rawValueinicializador: é um inicializador gerado automaticamente paraenum s.

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

Vejo: A linguagem de programação Swift § Enumerações


NOTA: Esta resposta foi alterada. A versão anterior do Swift usa o método de classe fromRaw()para converter valores brutos em valores enumerados.


Observe também que, se a tag do remetente não corresponder a um valor enum, isso causará uma falha devido ao !.
Ben Leggiero

2
Eu diria que bater é a melhor maneira de pegar um bug nesse caso.
XY

0

Swift 5

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

Você não respondeu à pergunta, em vez de comentar que não sabe por que alguém votou negativamente, verifique a pergunta e sua resposta novamente por que alguém votou negativamente.
Renetik 22/02/19

0

elaborando a resposta de Jeffery Thomas. ser seguro colocar uma declaração de guarda desembrulhar o elenco antes de usá-lo, isso evitará falhas

   @IBAction func selectFilter(sender: AnyObject) {
     guard let filter = MyTimeFilter(rawValue: (sender as UIButton).tag) else { 
        return
    }
        timeFilterSelected = filter
     }
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.