Я очень новичок в 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
Я не знаю, является ли мой подход (с использованием свойства тега) лучшим, но в любом случае мне нужно выполнять такой тип приведения в разных местах моего приложения. У кого-нибудь есть идеи как избавиться от этой ошибки?
Спасибо!
(sender as UIButton)
, вы можете просто изменить сигнатуру метода, чтобы взятьUIButton
вместоAnyObject
.Ответы:
Используйте
rawValue
инициализатор: это инициализатор, автоматически сгенерированный дляenum
s.см .: Язык программирования Swift § Перечисления
ПРИМЕЧАНИЕ. Этот ответ изменился. Более ранняя версия Swift использовала метод класса
fromRaw()
для преобразования необработанных значений в перечисляемые значения.источник
!
.Swift 5
источник
уточняя ответ Джеффри Томаса. чтобы быть в безопасности, поместите выражение охранника, разверните приведение перед использованием, это предотвратит сбои
источник