Swift - Int'yi enum'a çevir: Int


134

Swift için çok yeniyim (bu hafta başladım) ve uygulamamı Objective-C'den taşıyorum. Temelde iyi çalışır Objective-C aşağıdaki kodu var:

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'e çevirirken aşağıdakileri yaptım:

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

Bunu yaparak hatayı alıyorum:

'Int', 'MyTimeFilter' biçimine dönüştürülemez

Benim yaklaşım (tag özelliği kullanarak) iyi olup olmadığını bilmiyorum, ama yine de benim app farklı yerlerde döküm bu tür yapmak gerekir. Herkes bu hatadan kurtulmak için bir fikri var mı?

Teşekkürler!


2
Ayrıca yerine unutmayın (sender as UIButton), sadece bir almak yöntem imzası değiştirebilir UIButtonyerine AnyObject.
Ben Leggiero

Yanıtlar:


240

rawValueBaşlatıcıyı kullanın : enums için otomatik olarak oluşturulan bir başlatıcıdır .

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

bakınız: Hızlı Programlama Dili § Numaralamalar


NOT: Bu cevap değişti. Swift'in önceki sürümü fromRaw()ham değerleri numaralandırılmış değerlere dönüştürmek için class yöntemini kullanır.


Ayrıca, gönderenin etiketi bir numara değerine karşılık gelmezse, bunun nedeniyle bir kilitlenmeye neden olacağını unutmayın !.
Ben Leggiero

2
Çökme bu durumda bir hata yakalamak için en iyi yol olduğunu söyleyebilirim.
XY

0

Hızlı 5

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

Soruyu hiç cevaplamadınız, birisinin neden aşağı düştüğünü bilmediğinizi yorumlamak yerine, soruyu kontrol edin ve cevabınızı tekrar neden birisinin neden aşağı düştüğünü yorumlamak yerine.
Renetik

0

Jeffery Thomas'ın cevabını detaylandırıyor. bir güvenlik ifadesi kullanmadan önce dökümün paketini açın,

   @IBAction func selectFilter(sender: AnyObject) {
     guard let filter = MyTimeFilter(rawValue: (sender as UIButton).tag) else { 
        return
    }
        timeFilterSelected = filter
     }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.