Swift-Intをenum: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];
}

それをスウィフトに翻訳するとき、私は次のことをしました:

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
Ben Leggiero 16

回答:


240

rawValueイニシャライザを使用します。これは、enums に対して自動的に生成されるイニシャライザです。

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

参照:Swiftプログラミング言語§列挙


注:この回答は変更されました。Swiftの以前のバージョンでは、クラスメソッドfromRaw()を使用して生の値を列挙値に変換します。


送信者のタグが列挙値に対応していない場合、これが原因でクラッシュが発生することにも注意してください!
Ben Leggiero 16

2
この場合、バグをキャッチするにはクラッシュが最善の方法だと思います。
XY

0

スウィフト5

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

なぜ誰かが反対票を投じたのかわからない、とコメントするのではなく、質問にまったく答えなかった。誰かが反対票を投じた理由を質問と回答をもう一度確認する。
Renetik、

0

ジェフリー・トーマスの答えについて詳しく説明します。安全に配置するために、ガードステートメントを使用する前にキャストをアンラップします。これにより、クラッシュを回避できます

   @IBAction func selectFilter(sender: AnyObject) {
     guard let filter = MyTimeFilter(rawValue: (sender as UIButton).tag) else { 
        return
    }
        timeFilterSelected = filter
     }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.