2010-02-06 21 views
169

Tôi đã khai báo một tệp enum trong tệp triển khai của mình như được hiển thị bên dưới và đã khai báo biến của loại đó trong giao diện của tôi là PlayerState thePlayerState; và sử dụng biến trong phương pháp của tôi. Nhưng tôi nhận được lỗi nói rằng nó không được khai báo. Làm thế nào để khai báo và sử dụng một biến kiểu PlayerState trong phương pháp của tôi ?:Làm cách nào để xác định và sử dụng ENUM trong Objective-C?

Trong tập tin .m

@implementation View1Controller 

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

trong file .h một cách chính xác:

@interface View1Controller : UIViewController { 

    PlayerState thePlayerState; 

trong một số phương pháp trong .m tệp:

-(void)doSomethin{ 

thePlayerState = PLAYER_OFF; 

} 
+2

Bây giờ loại enum là thePlayerState. PlayerStateTypes trở thành gì? –

+3

Để biết thông tin về NS_ENUM và cú pháp hiện đại mới nhất của nó, xem bài viết [NS_ENUM & NS_OPTIONS] (http://nshipster.com/ns_enum-ns_options/) của Mattt Thompson. –

Trả lời

106

typedef cần phải có trong tệp tiêu đề (hoặc một số tệp khác là #import ed vào tiêu đề của bạn), bởi vì nếu không thì trình biên dịch sẽ không biết kích thước nào để làm cho hình dạng thanh ngang PlayerState. Ngoài ra, có vẻ ổn với tôi.

+16

+1. Bất cứ điều gì bạn có thể làm trong C hoạt động trong Objective-C. –

+0

Các tùy chọn để đặt nó trong một tập tin riêng biệt có vẻ đúng trong trường hợp của tôi. Tôi không biết nếu đây là một cách tiếp cận tốt, nhưng tôi cần phải sử dụng cùng một enum trong hai ViewControllers khác nhau (tự và đó là delegate/datasource). Việc nhập tiêu đề của đại biểu/nguồn dữ liệu dẫn đến lỗi và có vẻ quá nhiều cho một nhu cầu đơn giản. Vì vậy, tôi đã tạo một tệp .h mới với enum được khai báo và nhập nó trên cả hai tệp viewControllers.h.Làm việc như người ở. –

+6

Nên đề nghị sử dụng macro NS_ENUM - vì đây là phương pháp hay nhất – khebbie

16

Đây là cách Apple đã làm nó cho các lớp học như NSString:

Trong tập tin tiêu đề:

enum { 
    PlayerStateOff, 
    PlayerStatePlaying, 
    PlayerStatePaused 
}; 

typedef NSInteger PlayerState; 

Tham khảo Hướng dẫn Mã hóa tại http://developer.apple.com/

+3

Điều này không thực sự giúp OP. Trong khi kỹ thuật chính xác, nó không nói với họ làm thế nào để tạo ra một enum tái sử dụng – RyanR

+21

Liên kết đến developer.apple.com là không thực sự hữu ích. Thay vào đó, có một số địa điểm khác mà bạn muốn trích dẫn không? – Brett

+0

Sao chép/dán tài liệu đã được cung cấp, liên kết là trang chính thực sự không giúp đỡ người khác ... –

23

Trong .h:

typedef enum { 
    PlayerStateOff, 
    PlayerStatePlaying, 
    PlayerStatePaused 
} PlayerState; 
+0

Bạn có thể tìm thấy câu trả lời như thế này trong các câu hỏi SO khác, nhưng khi tôi đang xem xét enums, câu hỏi này xuất hiện đầu tiên, vì vậy tôi cũng đã thêm câu trả lời ở đây . –

191

Apple cung cấp macro để giúp cung cấp khả năng tương thích mã tốt hơn, bao gồm cả Swift. Sử dụng macro trông như thế này.

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

Documented here

+0

Có thể Obj C Enums có các biến thành viên như chúng có thể trong Java không? Nếu vậy, làm thế nào? – clocksmith

+0

Vì vậy, giải pháp thứ hai là tốt hơn? –

+3

Giải pháp thứ hai là tốt hơn (sử dụng 'NS_ENUM'), vì nó hiện đại hơn, và bây giờ được yêu cầu trong Objective-C nếu bạn muốn enum của bạn có sẵn trong mã Swift. – smileyborg

19

Với các dự án hiện tại bạn có thể muốn sử dụng NS_ENUM() hoặc NS_OPTIONS() macro.

typedef NS_ENUM(NSUInteger, PlayerState) { 
     PLAYER_OFF, 
     PLAYER_PLAYING, 
     PLAYER_PAUSED 
    }; 
+2

Bài viết hay này giải thích tại sao: http://nshipster.com/ns_enum-ns_options/ – smileyborg

+2

... và quan trọng hơn bây giờ, bạn phải khai báo enums bằng cách sử dụng 'NS_ENUM' trong Objective-C nếu bạn muốn enum của bạn có sẵn trong Swift mã. – smileyborg

5

Tôi khuyên bạn nên sử dụng NS_OPTIONS hoặc NS_ENUM. Bạn có thể đọc thêm tại đây: http://nshipster.com/ns_enum-ns_options/

Đây là ví dụ từ mã của riêng tôi sử dụng NS_OPTIONS, tôi có một tiện ích đặt lớp con (CALayer) trên lớp của UIView để tạo đường viền.

h. file:

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 

Các tập tin .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 
Các vấn đề liên quan