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!
(sender as UIButton)
Sie auch, dass Sie stattdessen einfach die Methodensignatur ändern können, um einUIButton
statt zu übernehmenAnyObject
.Antworten:
Verwenden Sie den
rawValue
Initialisierer: Es ist ein Initialisierer, der automatisch fürenum
s generiert wird .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.quelle
!
.Swift 5
quelle
Ausarbeitung der Antwort von Jeffery Thomas. Um sicher zu gehen, dass eine Schutzanweisung den Gipsverband vor der Verwendung auspackt, werden Abstürze vermieden
quelle