Bagaimana cara saya mendefinisikan dan menggunakan ENUM di Objective-C?

180

Saya mendeklarasikan enum dalam file implementasi saya seperti yang ditunjukkan di bawah ini, dan mendeklarasikan variabel jenis itu di antarmuka saya sebagai PlayerState thePlayerState; dan menggunakan variabel dalam metode saya. Tapi saya mendapatkan kesalahan yang menyatakan bahwa itu tidak dideklarasikan. Bagaimana cara mendeklarasikan dan menggunakan variabel tipe PlayerState dengan benar dalam metode saya ?:

Dalam file .m

@implementation View1Controller

    typedef enum playerStateTypes
        {
            PLAYER_OFF,
            PLAYER_PLAYING,
            PLAYER_PAUSED
        } PlayerState;

dalam file .h:

@interface View1Controller : UIViewController {

    PlayerState thePlayerState;

dalam beberapa metode dalam file .m:

-(void)doSomethin{

thePlayerState = PLAYER_OFF;

}
RexOnRoids
sumber
2
Sekarang tipe enum adalah thePlayerState. Menjadi apa playerStateTypes?
user4951
3
Untuk informasi tentang NS_ENUM dan sintaksis modern terbaru, lihat posting NS_ENUM & NS_OPTIONS oleh Mattt Thompson.
Basil Bourque

Jawaban:

109

Anda typedefperlu berada di file header (atau file lain yang #importdiedit ke header Anda), karena jika tidak kompiler tidak akan tahu ukuran untuk membuat PlayerStateivar. Selain itu, itu terlihat baik-baik saja bagi saya.

Dave DeLong
sumber
Pilihan untuk meletakkannya di file terpisah sepertinya benar dalam kasus saya. Saya tidak tahu apakah ini pendekatan yang baik, tetapi saya perlu menggunakan enum yang sama di dua ViewControllers yang berbeda (self dan itu delegasi / sumber data). Mengimpor tajuk delegasi / sumber data menghasilkan kesalahan dan tampaknya terlalu banyak untuk kebutuhan sederhana. Jadi saya membuat file .h baru dengan enum dideklarasikan dan mengimpornya pada file viewControllers.h. Bekerja seperti pesona.
Leandro Alves
7
Harus merekomendasikan untuk menggunakan makro NS_ENUM - karena ini adalah praktik terbaik
khebbie
1
Anda harus mendeklarasikan enum menggunakan NS_ENUMdalam Objective-C jika Anda ingin enum Anda tersedia dalam kode Swift.
smileyborg
@DaveDeLong, Apakah ini masih berlaku di 2015? Saya sudah typedefmendeklarasikannya di .mfile dan mengkompilasi dan berjalan dengan baik.
Iulian Onofrei
@IulianOnofrei akan masuk dalam file .h jika Anda perlu menggunakan enum di file lain. Jika Anda hanya membutuhkannya dalam satu file, memasukkannya ke file .m selalu baik-baik saja.
Dave DeLong
206

Apple menyediakan makro untuk membantu memberikan kompatibilitas kode yang lebih baik, termasuk Swift. Menggunakan makro terlihat seperti ini.

typedef NS_ENUM(NSInteger, PlayerStateType) {
  PlayerStateOff,
  PlayerStatePlaying,
  PlayerStatePaused
};

Didokumentasikan di sini

pemberontak
sumber
Dapatkah Obj C Enum memiliki variabel anggota seperti yang mereka dapat di Jawa? Jika ya, bagaimana caranya?
tukang kunci
Jadi solusi kedua lebih baik?
Iulian Onofrei
3
Solusi kedua lebih baik (menggunakan NS_ENUM), karena lebih modern, dan sekarang diperlukan di Objective-C jika Anda ingin enum Anda tersedia dalam kode Swift.
smileyborg
Diperbarui untuk menunjukkan solusi kedua sebenarnya lebih baik.
pemberontak
Dalam bentuk standar Apple, nama jenis diulang untuk setiap nilai enum.
ThomasW
29

Dalam .h:

typedef enum {
    PlayerStateOff,
    PlayerStatePlaying,
    PlayerStatePaused
} PlayerState;
Ben Flynn
sumber
1
Anda dapat menemukan jawaban seperti ini di pertanyaan SO lainnya, tetapi ketika saya meninjau enum, pertanyaan ini muncul lebih dulu, jadi saya menambahkan jawabannya di sini juga.
Ben Flynn
19

Dengan proyek saat ini Anda mungkin ingin menggunakan makro NS_ENUM()atau NS_OPTIONS().

typedef NS_ENUM(NSUInteger, PlayerState) {
        PLAYER_OFF,
        PLAYER_PLAYING,
        PLAYER_PAUSED
    };
sean woodward
sumber
2
... dan yang lebih penting sekarang, Anda harus mendeklarasikan enum menggunakan NS_ENUMdalam Objective-C jika Anda ingin enum Anda tersedia dalam kode Swift.
smileyborg
16

Beginilah cara Apple melakukannya untuk kelas-kelas seperti NSString:

Dalam file header:

enum {
    PlayerStateOff,
    PlayerStatePlaying,
    PlayerStatePaused
};

typedef NSInteger PlayerState;

Lihat Panduan Pengkodean di http://developer.apple.com/

Santhos
sumber
3
Ini sebenarnya tidak membantu OP. Meskipun secara teknis benar, itu tidak memberi tahu mereka cara membuat enum dapat digunakan kembali
RyanR
24
Menautkan ke developer.apple.com tidak sangat membantu. Apakah ada tempat lain yang ingin Anda kutip?
Brett
Salin / rekatkan dokumentasi yang telah diberikan, tautan yang merupakan halaman utama benar-benar tidak membantu orang lain ...
Onder OZCAN
3
Ini sudah ketinggalan zaman, lihat halaman ini developer.apple.com/library/ios/releasenotes/ObjectiveC/…
Alex Chesters
8

Saya sarankan menggunakan NS_OPTIONS atau NS_ENUM. Anda dapat membaca lebih lanjut tentang ini di sini: http://nshipster.com/ns_enum-ns_options/

Berikut adalah contoh dari kode saya sendiri menggunakan NS_OPTIONS, saya memiliki utilitas yang menetapkan sublapisan (CALayer) pada lapisan UIView untuk membuat perbatasan.

H. mengajukan:

typedef NS_OPTIONS(NSUInteger, BSTCMBorder) {
    BSTCMBOrderNoBorder     = 0,
    BSTCMBorderTop          = 1 << 0,
    BSTCMBorderRight        = 1 << 1,
    BSTCMBorderBottom       = 1 << 2,
    BSTCMBOrderLeft         = 1 << 3
};

@interface BSTCMBorderUtility : NSObject

+ (void)setBorderOnView:(UIView *)view
                 border:(BSTCMBorder)border
                  width:(CGFloat)width
                  color:(UIColor *)color;

@end

File .m:

@implementation BSTCMBorderUtility

+ (void)setBorderOnView:(UIView *)view
                 border:(BSTCMBorder)border
                  width:(CGFloat)width
                  color:(UIColor *)color
{

    // Make a left border on the view
    if (border & BSTCMBOrderLeft) {

    }

    // Make a right border on the view
    if (border & BSTCMBorderRight) {

    }

    // Etc

}

@end
Johannes
sumber