Anda harus membuat pengakses khusus jika ingin membatasi nilai ke enum. Jadi, pertama-tama Anda akan mendeklarasikan enum, seperti:
typedef enum {
kPaymentFrequencyOneOff = 0,
kPaymentFrequencyYearly = 1,
kPaymentFrequencyMonthly = 2,
kPaymentFrequencyWeekly = 3
} PaymentFrequency;
Kemudian, deklarasikan pengambil dan penyetel untuk properti Anda. Ide buruk untuk menimpa yang sudah ada, karena pengakses standar mengharapkan objek NSNumber daripada jenis skalar, dan Anda akan mengalami masalah jika ada yang ada di binding atau sistem KVO mencoba dan mengakses nilai Anda.
- (PaymentFrequency)itemTypeRaw {
return (PaymentFrequency)[[self itemType] intValue];
}
- (void)setItemTypeRaw:(PaymentFrequency)type {
[self setItemType:[NSNumber numberWithInt:type]];
}
Terakhir, Anda harus mengimplementasikan + keyPathsForValuesAffecting<Key>
agar Anda mendapatkan notifikasi KVO untuk itemTypeRaw saat itemType berubah.
+ (NSSet *)keyPathsForValuesAffectingItemTypeRaw {
return [NSSet setWithObject:@"itemType"];
}
enum
s?int16_t
dan Anda sudah siap.Anda dapat melakukan ini dengan cara yang lebih sederhana:
Dan dalam model Anda, setel
itemType
menjadi angka 16 bit. Semua selesai. Tidak perlu kode tambahan. Letakkan saja seperti biasaJika Anda menggunakan Xcode untuk membuat
NSManagedObject
subclass Anda , pastikan bahwa setelan " gunakan properti skalar untuk tipe data primitif " dicentang.sumber
retain
terkait dengan manajemen memori, bukan apakah itu disimpan ke dalam database atau tidak.Pendekatan alternatif yang saya pertimbangkan bukanlah mendeklarasikan enum sama sekali, melainkan mendeklarasikan nilai sebagai metode kategori di NSNumber.
sumber
Jika Anda menggunakan mogenerator, lihat ini: https://github.com/rentzsch/mogenerator/wiki/Using-enums-as-types . Anda dapat memiliki atribut Integer 16 yang dipanggil
itemType
, denganattributeValueScalarType
nilaiItem
di info pengguna. Kemudian, di info pengguna untuk entitas Anda, seteladditionalHeaderFileName
ke nama header tempatItem
enum didefinisikan masuk Saat membuat file header Anda, mogenerator secara otomatis akan membuat properti memilikiItem
tipe.sumber
Saya mengatur tipe atribut sebagai integer 16 bit kemudian menggunakan ini:
...
sumber
Karena enum didukung oleh short standar, Anda juga tidak dapat menggunakan pembungkus NSNumber dan menyetel properti secara langsung sebagai nilai skalar. Pastikan untuk menyetel jenis data dalam model data inti sebagai "Integer 32".
MyEntity.h
Di tempat lain dalam kode
Atau mengurai dari string JSON atau memuat dari file
sumber
Saya telah sering melakukan ini dan merasa formulir berikut berguna:
Dalam hal ini, enumnya cukup sederhana:
dan menyebutnya pedantic, tapi saya menggunakan enum untuk nama field, seperti ini:
Karena ini bisa melelahkan untuk model data yang kompleks, saya menulis generator kode yang menggunakan MOM / entitas untuk mengeluarkan semua pemetaan. Masukan saya akhirnya menjadi kamus dari Tabel / Baris ke tipe Enum. Saat saya melakukannya, saya juga membuat kode serialisasi JSON. Saya telah melakukan ini untuk model yang sangat kompleks dan ternyata sangat menghemat waktu.
sumber
Kode yang ditempel di bawah berfungsi untuk saya, dan saya telah menambahkannya sebagai contoh yang berfungsi penuh. Saya ingin mendengar opini tentang pendekatan ini, karena saya berencana untuk menggunakannya secara luas di seluruh aplikasi saya.
Saya telah meninggalkan @dynamic di tempatnya, karena kemudian dipuaskan oleh pengambil / penyetel yang disebutkan dalam properti.
Sesuai jawaban oleh iKenndac, saya belum mengganti nama pengambil / penyetel default.
Saya telah menyertakan beberapa pemeriksaan rentang melalui NSAssert pada nilai valid typedef.
Saya juga menambahkan metode untuk mendapatkan nilai string untuk typedef yang diberikan.
Saya mengawali konstanta dengan "c" bukan "k". Saya tahu alasan di balik "k" (asal mula matematika, historis), tetapi rasanya seperti saya membaca kode ESL dengannya, jadi saya menggunakan "c". Hanya masalah pribadi.
Ada pertanyaan serupa di sini: typedef sebagai tipe data Inti
Saya akan menghargai masukan apa pun tentang pendekatan ini.
sumber
Solusi untuk Kelas yang Dibuat Otomatis
dari Generator Kode Xcode (ios 10 dan lebih tinggi)
Jika Anda membuat Entitas dengan nama "KelasAnda", Xcode secara otomatis akan memilih "Definisi Kelas" sebagai default jenis Codegen di "Inspektur Model Data". ini akan menghasilkan kelas-kelas di bawah ini:
Versi Swift:
Versi Objective-C:
Kami akan memilih "Kategori / Ekstensi" dari opsi Codegen daripada "Definisi Kelas" di Xcode.
Sekarang, Jika kita ingin menambahkan enum, buka dan buat ekstensi lain untuk kelas yang dibuat secara otomatis, dan tambahkan definisi enum Anda di sini seperti di bawah ini:
Sekarang, Anda dapat membuat pengakses kustom jika Anda ingin membatasi nilai ke enum. Silakan periksa jawaban yang diterima oleh pemilik pertanyaan . Atau Anda dapat mengonversi enum Anda saat Anda mengaturnya dengan metode konversi eksplisit menggunakan operator cast seperti di bawah ini:
Periksa juga
Pembuatan subclass otomatis Xcode
sumber