Saya tidak berpikir saya pada dasarnya mengerti apa itu enum
itu, dan kapan menggunakannya.
Sebagai contoh:
typedef enum {
kCircle,
kRectangle,
kOblateSpheroid
} ShapeType;
Apa yang sebenarnya dinyatakan di sini?
objective-c
enums
typedef
Craig
sumber
sumber
Jawaban:
Tiga hal yang sedang dinyatakan di sini: tipe enumerasi anonim dinyatakan,
ShapeType
sedang mendeklarasikan typedef untuk itu pencacahan anonim, dan tiga namakCircle
,kRectangle
dankOblateSpheroid
sedang dinyatakan sebagai konstanta integral.Mari kita hancurkan itu. Dalam kasus yang paling sederhana, enumerasi dapat dinyatakan sebagai
Ini menyatakan enumerasi dengan tag
tagname
. Dalam C dan Objective-C (tetapi bukan C ++), referensi apa pun harus didahului denganenum
kata kunci. Sebagai contoh:Untuk menghindari keharusan menggunakan
enum
kata kunci di mana-mana, typedef dapat dibuat:Ini dapat disederhanakan menjadi satu baris:
Dan akhirnya, jika kita tidak perlu dapat menggunakan
enum tagname
denganenum
kata kunci, kita dapat membuatenum
anonim dan hanya menyatakan itu dengan nama typedef:Sekarang, dalam hal ini, kami mendeklarasikan
ShapeType
sebagai nama enumerasi anonim yang diketikkan.ShapeType
adalah benar-benar hanya tipe integral, dan seharusnya hanya digunakan untuk mendeklarasikan variabel yang memegang salah satu dari nilai yang tercantum dalam deklarasi (yaitu, salah satu darikCircle
,kRectangle
, dankOblateSpheroid
). Anda dapat menetapkanShapeType
variabel nilai lain dengan casting, jadi Anda harus berhati-hati saat membaca nilai enum.Akhirnya,
kCircle
,kRectangle
, dankOblateSpheroid
dinyatakan sebagai konstanta integral dalam namespace global. Karena tidak ada nilai spesifik yang ditentukan, mereka ditugaskan ke integer berturut-turut dimulai dengan 0, jadikCircle
0,kRectangle
1, dankOblateSpheroid
2.sumber
Apple merekomendasikan mendefinisikan enum seperti ini sejak Xcode 4.4 :
Mereka juga menyediakan makro yang berguna
NS_ENUM
:Definisi ini memberikan pengecekan tipe yang lebih kuat dan penyelesaian kode yang lebih baik. Saya tidak dapat menemukan dokumentasi resmi
NS_ENUM
, tetapi Anda dapat menonton video "Modern Objective-C" dari sesi WWDC 2012 di sini .PEMBARUAN
Tautan ke dokumentasi resmi di sini .
sumber
NS_ENUM
makro Apple oleh NSHipster: NSHipster.com/ns_enum-ns_optionsEnum mendeklarasikan seperangkat nilai yang dipesan - typedef hanya menambahkan nama yang berguna untuk ini. Elemen 1 adalah 0 dll.
Di atas hanyalah penghitungan tag shapeType.
sumber
Sebuah didefinisikan tipe user yang memiliki nilai yang mungkin dari
kCircle
,kRectangle
, ataukOblateSpheroid
. Nilai-nilai di dalam enum (kCircle, dll) terlihat di luar enum. Penting untuk mengingat hal itu (int i = kCircle;
valid, misalnya).sumber
Pembaruan untuk Perubahan 64-bit: Menurut apple docs tentang perubahan 64-bit,
Jadi, Anda harus membuat enum dengan tipe seperti sintaks di bawah ini jika Anda mendukung 64-bit.
atau
Jika tidak, itu akan menyebabkan peringatan sebagai
Implicit conversion loses integer precision: NSUInteger (aka 'unsigned long') to ShapeType
Pembaruan untuk pemrograman cepat:
Di cepat, ada perubahan sintaksis.
sumber
Enum (singkatan enumeration) digunakan untuk menghitung satu set nilai (enumerator). Nilai adalah hal abstrak yang diwakili oleh simbol (kata). Misalnya, enum dasar bisa jadi
Enum ini disebut anonim karena Anda tidak memiliki simbol untuk menamainya. Tetapi itu masih sangat benar. Gunakan saja seperti ini
Baik. Hidup itu indah dan semuanya berjalan dengan baik. Tetapi suatu hari Anda perlu menggunakan kembali enum ini untuk mendefinisikan variabel baru untuk menyimpan myGrandFatherPantSize, lalu Anda menulis:
Tetapi kemudian Anda memiliki kesalahan kompiler "redefinition of enumerator". Sebenarnya, masalahnya adalah bahwa kompiler tidak yakin bahwa Anda pertama kali enum dan Anda yang kedua menjelaskan hal yang sama.
Kemudian jika Anda ingin menggunakan kembali enumerator yang sama (di sini xs ... xxxxl) di beberapa tempat Anda harus menandainya dengan nama yang unik. Kali kedua Anda menggunakan set ini, Anda hanya perlu menggunakan tag. Tapi jangan lupa bahwa tag ini tidak menggantikan kata enum tetapi hanya kumpulan enumerator. Kemudian berhati-hatilah menggunakan enum seperti biasa. Seperti ini:
Anda dapat menggunakannya dalam definisi parameter juga:
Anda bisa mengatakan bahwa menulis ulang enum di mana-mana tidak nyaman dan membuat kode terlihat agak aneh. Kamu benar. Tipe nyata akan lebih baik.
Ini adalah langkah terakhir dari kemajuan besar kita menuju puncak. Dengan hanya menambahkan typedef, mari kita ubah enum kita menjadi tipe nyata. Oh, hal terakhir, typedef tidak diperbolehkan di dalam kelas Anda. Kemudian tentukan jenis Anda tepat di atas. Lakukan seperti ini:
Ingat bahwa tag ini opsional. Maka sejak di sini, dalam hal ini, kami tidak menandai enumerator tetapi hanya untuk menentukan tipe baru. Maka kita tidak benar-benar membutuhkannya lagi.
Jika Anda mengembangkan di Objective-C dengan XCode saya membiarkan Anda menemukan beberapa makro bagus diawali dengan NS_ENUM. Itu akan membantu Anda untuk mendefinisikan enum yang baik dengan mudah dan terlebih lagi akan membantu penganalisa statis untuk melakukan beberapa pemeriksaan menarik untuk Anda sebelum dikompilasi.
Enum yang bagus!
sumber
typedef
berguna untuk mendefinisikan kembali nama tipe variabel yang ada. Ini menyediakan cara singkat & bermakna untuk memanggil tipe data. misalnya:di sini, tipe unsigned long int didefinisikan ulang dari tipe TWOWORDS. Dengan demikian, kita sekarang dapat mendeklarasikan variabel tipe unsigned long int dengan menulis,
dari pada
sumber
maka Anda dapat menggunakannya seperti: -
dan
sekarang kamu bisa menggunakannya seperti: -
sumber
enum digunakan untuk memberikan nilai pada elemen enum yang tidak dapat dilakukan dalam struct. Jadi setiap kali alih-alih mengakses variabel lengkap kita bisa melakukannya dengan nilai yang kita tetapkan untuk variabel dalam enum. Secara default dimulai dengan penugasan 0 tetapi kita dapat menetapkan nilai apa pun dan variabel berikutnya dalam enum akan diberi nilai nilai sebelumnya +1.
sumber
Anda dapat menggunakan dalam format di bawah ini, nilai baku baku mulai dari 0, jadi
Anda dapat menetapkan nilai awal spesifik Anda sendiri.
sumber
Typedef memungkinkan pemrogram untuk mendefinisikan satu tipe Objective-C sebagai yang lain. Sebagai contoh,
typedef int Counter; mendefinisikan tipe Counter agar setara dengan tipe int. Ini secara drastis meningkatkan keterbacaan kode.
sumber
Typedef adalah Kata Kunci dalam C dan C ++. Ini digunakan untuk membuat nama baru untuk tipe data dasar (char, int, float, double, struct & enum) .
Di sini ia membuat enumerasi tipe data ShapeType & kita dapat menulis nama baru untuk enum tipe ShapeType seperti yang diberikan di bawah ini
sumber
enum dapat mengurangi banyak jenis "kesalahan" dan membuat kode lebih mudah dikelola
Definisi tersebut tidak memiliki kendala. Itu hanyalah sebuah penggantian. Itu tidak dapat membatasi semua kondisi negara. Ketika NEGARA ditugaskan ke 5, program akan salah, karena tidak ada negara yang cocok. Tetapi kompiler tidak akan memperingatkan STATE = 5
Jadi lebih baik menggunakan seperti ini
sumber