Swift - Masukkan Int ke dalam enum: Int

135

Saya sangat baru mengenal Swift (mulai minggu ini) dan saya memigrasikan aplikasi saya dari Objective-C. Saya pada dasarnya memiliki kode berikut di Objective-C yang berfungsi dengan baik:

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

Saat menerjemahkannya ke Swift, saya melakukan hal berikut:

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

Dengan melakukan itu, saya mendapatkan kesalahan:

'Int' tidak dapat diubah menjadi 'MyTimeFilter'

Saya tidak tahu apakah pendekatan saya (menggunakan properti tag) adalah yang terbaik, tetapi saya perlu melakukan transmisi semacam ini di tempat yang berbeda dalam aplikasi saya. Apakah ada yang punya ide tentang cara menghilangkan kesalahan ini?

Terima kasih!

Marcos Duarte
sumber
2
Perhatikan juga bahwa alih-alih (sender as UIButton), Anda cukup mengubah tanda tangan metode untuk mengambil UIButtonalih-alih AnyObject.
Ben Leggiero

Jawaban:

244

Gunakan rawValuepenginisialisasi: ini adalah penginisialisasi yang dibuat secara otomatis untuk enums.

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

lihat: Bahasa Pemrograman Swift § Penghitungan


CATATAN: Jawaban ini telah berubah. Versi Swift yang lebih lama menggunakan metode kelas fromRaw()untuk mengonversi nilai mentah menjadi nilai yang disebutkan.

Jeffery Thomas
sumber
Perhatikan juga bahwa jika tag pengirim tidak sesuai dengan nilai enum, ini akan menyebabkan error karena !.
Ben Leggiero
2
Menurut saya, menabrak adalah cara terbaik untuk menangkap bug dalam kasus ini.
XY
0

Cepat 5

@IBAction func selectFilter(sender: AnyObject) {
    timeFilterSelected = MyTimeFilter(rawValue: sender.tag)
 }
Alok
sumber
Anda tidak menjawab pertanyaan sama sekali, alih-alih berkomentar bahwa Anda tidak tahu mengapa seseorang menurunkan suara, periksa pertanyaan dan jawaban Anda lagi mengapa seseorang menurunkan suara. Baiklah saya juga harus menurunkannya.
Renetik
0

menguraikan jawaban Jeffery Thomas. untuk amannya tempatkan pernyataan penjaga membuka gips sebelum menggunakannya, ini akan menghindari crash

   @IBAction func selectFilter(sender: AnyObject) {
     guard let filter = MyTimeFilter(rawValue: (sender as UIButton).tag) else { 
        return
    }
        timeFilterSelected = filter
     }
Abraham Gonzalez
sumber