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”

我不知道我的方法(使用tag属性)是否最佳,但是无论如何,我都需要在应用程序的不同位置进行这种类型的转换。有谁知道如何摆脱这个错误?

谢谢!


2
另请注意(sender as UIButton),您可以更改方法签名UIButton而不是来代替AnyObject
Ben Leggiero

Answers:


240

使用rawValue初始化程序:这是为enums 自动生成的初始化程序。

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

请参阅:Swift编程语言§枚举


注意:此答案已更改。Swift的早期版本使用class方法fromRaw()将原始值转换为枚举值。


另请注意,如果发件人的标签与枚举值不对应,则会由于导致崩溃!
Ben Leggiero

2
我想说崩溃是在这种情况下捕获错误的最佳方法。
XY

0

斯威夫特5

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

您根本没有回答问题,而是没有评论说您不知道为什么有人投票,请再次检查问题,然后再回答为什么有人投票。我也必须对此投票。
Renetik '19

0

详细阐述了杰弗里·托马斯(Jeffery Thomas)的答案。为了安全起见,请在使用保护贴之前先将保护贴解开包装,以避免崩溃

   @IBAction func selectFilter(sender: AnyObject) {
     guard let filter = MyTimeFilter(rawValue: (sender as UIButton).tag) else { 
        return
    }
        timeFilterSelected = filter
     }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.