Swift - Cast Int in Aufzählung: Int


134

Ich bin sehr neu in Swift (habe diese Woche angefangen) und migriere meine App von Objective-C. Ich habe im Grunde den folgenden Code in Objective-C, der gut funktioniert:

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

Bei der Übersetzung in Swift habe ich Folgendes getan:

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

Auf diese Weise erhalte ich den Fehler:

'Int' kann nicht in 'MyTimeFilter' konvertiert werden

Ich weiß nicht, ob mein Ansatz (unter Verwendung der Tag-Eigenschaft) der beste ist, aber ich muss diese Art von Casting an verschiedenen Stellen in meiner App durchführen. Hat jemand eine Idee, wie man diesen Fehler beseitigt?

Vielen Dank!


2
Beachten (sender as UIButton)Sie auch, dass Sie stattdessen einfach die Methodensignatur ändern können, um ein UIButtonstatt zu übernehmen AnyObject.
Ben Leggiero

Antworten:


240

Verwenden Sie den rawValueInitialisierer: Es ist ein Initialisierer, der automatisch für enums generiert wird .

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

siehe: Die Swift-Programmiersprache § Aufzählungen


HINWEIS: Diese Antwort hat sich geändert. Frühere Versionen von Swift verwenden die Klassenmethode fromRaw(), um Rohwerte in Aufzählungswerte zu konvertieren.


Beachten Sie auch, dass, wenn das Tag des Absenders keinem Aufzählungswert entspricht, dies aufgrund des !.
Ben Leggiero

2
Ich würde sagen, Absturz ist in diesem Fall der beste Weg, um einen Fehler zu erkennen.
XY

0

Swift 5

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

Sie haben die Frage überhaupt nicht beantwortet, anstatt zu kommentieren, dass Sie nicht wissen, warum jemand abgelehnt hat, überprüfen Sie die Frage und Ihre Antwort erneut, warum jemand abgelehnt hat. Nun, ich muss sie auch ablehnen.
Renetik

0

Ausarbeitung der Antwort von Jeffery Thomas. Um sicher zu gehen, dass eine Schutzanweisung den Gipsverband vor der Verwendung auspackt, werden Abstürze vermieden

   @IBAction func selectFilter(sender: AnyObject) {
     guard let filter = MyTimeFilter(rawValue: (sender as UIButton).tag) else { 
        return
    }
        timeFilterSelected = filter
     }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.