Свіфт - кинь Інт в перерахунок: 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 використовувала метод класу fromRaw()для перетворення значень "необроблені" в перелічені значення.


Також зауважте, що якщо тег відправника не відповідає значенню enum, це спричинить збій через !.
Бен Леджіеро

2
Я б сказав, що аварія - це найкращий спосіб зловити помилку в цьому випадку.
XY

0

Швидкий 5

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

Ви взагалі не відповіли на запитання, замість того, щоб коментувати, що не знаєте, чому хтось порушив голову, перевірте питання та ще раз свою відповідь, чому хтось зголосився.
Ренетик

0

детально описуючи відповідь Джеффі Томаса. Щоб надійно розмістити заявку охоронця, розгорніть актерський склад перед його використанням, це дозволить уникнути збоїв

   @IBAction func selectFilter(sender: AnyObject) {
     guard let filter = MyTimeFilter(rawValue: (sender as UIButton).tag) else { 
        return
    }
        timeFilterSelected = filter
     }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.