Swift - Ввести Int в перечисление: Int

134

Я очень новичок в Swift (начался на этой неделе), и я переношу свое приложение из Objective-C. У меня есть в основном следующий код в Objective-C, который работает нормально:

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

При переводе на Swift я сделал следующее:

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

Делая это, я получаю ошибку:

Int не конвертируется в MyTimeFilter

Я не знаю, является ли мой подход (с использованием свойства тега) лучшим, но в любом случае мне нужно выполнять такой тип приведения в разных местах моего приложения. У кого-нибудь есть идеи как избавиться от этой ошибки?

Спасибо!

Маркос Дуарте
источник
2
Также обратите внимание, что вместо (sender as UIButton), вы можете просто изменить сигнатуру метода, чтобы взять UIButtonвместо AnyObject.
Бен Легжеро

Ответы:

240

Используйте rawValueинициализатор: это инициализатор, автоматически сгенерированный для enums.

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

см .: Язык программирования Swift § Перечисления


ПРИМЕЧАНИЕ. Этот ответ изменился. Более ранняя версия Swift использовала метод класса fromRaw()для преобразования необработанных значений в перечисляемые значения.

Джеффри Томас
источник
Также обратите внимание, что если тег отправителя не соответствует значению перечисления, это вызовет сбой из-за !.
Бен Легжеро
2
Я бы сказал, что сбой - лучший способ поймать ошибку в этом случае.
XY
0

Swift 5

@IBAction func selectFilter(sender: AnyObject) {
    timeFilterSelected = MyTimeFilter(rawValue: sender.tag)
 }
Alok
источник
Вы вообще не ответили на вопрос, вместо того, чтобы прокомментировать, что вы не знаете, почему кто-то понизил голос, проверьте вопрос и ваш ответ еще раз, почему кто-то проголосовал. Ну, я тоже должен понизить его.
Ренетик
0

уточняя ответ Джеффри Томаса. чтобы быть в безопасности, поместите выражение охранника, разверните приведение перед использованием, это предотвратит сбои

   @IBAction func selectFilter(sender: AnyObject) {
     guard let filter = MyTimeFilter(rawValue: (sender as UIButton).tag) else { 
        return
    }
        timeFilterSelected = filter
     }
Авраам Гонсалес
источник