2010-07-03 34 views
5

Tôi mới tham gia Objective-C, nhưng có kinh nghiệm trong C++ và C.Lưu trữ enums trong NSArray?

Tôi muốn lưu trữ một số hằng số enum trong một mảng. Trong C++ tôi sẽ làm một cái gì đó như thế này:

enum color {RED, BLUE, YELLOW, GREEN}; 
vector<color> supportedColors; 
supportedColors.push_back(RED); 
supportedColors.push_back(GREEN); 

Nhưng NSArray sẽ chỉ cửa hàng đối tượng con trỏ (id's). Vậy chúng nên được lưu trữ như thế nào? Tôi có thể có thể cast chúng vào số nguyên và lưu trữ chúng trong một đối tượng NSNumber, nhưng điều này có vẻ lộn xộn.

Tôi tự hỏi những lập trình viên có kinh nghiệm làm gì?

Trả lời

13

Truyền chúng thành số nguyên và lưu trữ chúng trong NSNumbers. :)

Loại C gốc thực sự là công dân hạng hai trong các lớp sưu tập ca cao và thường tiết để làm việc nếu bạn muốn xen kẽ. C nói rằng enums có giá trị không thể thiếu, vì vậy nó an toàn để sử dụng chúng như là ints theo cách này.

Tùy thuộc vào những gì bạn đang làm tất nhiên, bạn có thể đơn giản hóa mã thao tác bằng cách bao bọc enum đó trong đối tượng thực ("MyColor") có enum là thuộc tính trên đó. Các đối tượng này sau đó có thể được ném xung quanh trong các lớp sưu tập như mong muốn, với một số chi phí trả trước và thời gian chạy mà không có vấn đề từ quan điểm hoàn hảo, tùy thuộc vào những gì bạn đang làm.

+0

Có một loại obj-C tốt đẹp cho một cái gì đó tôi có thể sử dụng trong một chuyển đổi ... trường hợp và cũng đưa vào một NSArray? – joerick

+0

@joerick: 'NSNumber' có thể được sử dụng với câu lệnh' switch': 'switch ([myNsNumber intValue]) ...'. –

+0

Tất nhiên. Cảm ơn các bạn! – joerick

0

tôi sẽ làm cho một lớp học mới xác định enum, và sau đó nhanh chóng màu sắc được hỗ trợ như

vector<colorEnumClass> supportedColours

sau đó bạn có thể làm những việc như: cung cấp cho các phương thức lớp để thử nghiệm một màu để xem nếu nó là một thành viên của vectơ .. sau đó bạn có thể sử dụng phương thức đó trong các câu lệnh IF thay vì kiểm thử rõ ràng bằng cách sử dụng các toán tử quan hệ. Mã hóa rõ ràng hơn :-)

chú ý rằng tên được hỗ trợColours gợi ý rằng vectơ này phải là hằng số, được xác định khi bắt đầu chương trình và không bao giờ thay đổi. Nếu đây là trường hợp thì "màu" trong vectơ phải được đặt trong hàm tạo và không bao giờ thay đổi. Lớp nên được thực hiện như một Singleton và bạn thậm chí có thể ghi đè các toán tử vector của pushback() vv để chặn các sửa đổi.

này nằm trong bản chất của "new" Java enumeration technology

tôi cũng nên đề cập đến rằng tôi quá mới để Objective C để cung cấp một ví dụ mã đúng cú pháp .. xin lỗi.

+2

Câu hỏi không phải là về các giải pháp trong C++ - 'vector ' là một ví dụ C++ về những gì anh ta muốn làm trong ObjC. –

0

Có lẽ bạn đang tìm cách đơn giản lặp qua tất cả các tùy chọn? Làm thế nào về chỉ là một kế hoạch cũ mảng bình thường?

typedef enum {RED,BLUE,GREEN,YELLOW} color; 

color colors[4]={RED,YELLOW,GREEN,BLUE}; 
for (int i=0;i<4;i++) 
    colors[i]; 

Mặt khác, nếu hiệu suất không phải là vấn đề và bạn chỉ đang tìm cách làm sạch mã một chút; làm thế nào về việc tạo ra một lớp ColorArray mà đóng gói NSMutableArray và tạo ra các phương pháp có liên quan.

ColorArray.h:

#import <Foundation/Foundation.h> 

typedef enum {RED,BLUE,GREEN,YELLOW} Color; 

@interface ColorArray : NSObject { 
    NSMutableArray* _array; 
} 

- (id) initWithArray:(Color[])colors; 

- (void) addColor:(Color)color; 
- (Color) colorAtIndex:(int)i; 

@end 

ColorArray.c:

#import "ColorArray.h" 

@implementation ColorArray 

- (id) init { 
    if (self = [super init]) { 
     _array = [[NSMutableArray alloc] init]; 
    } 
    return self; 
} 
- (id) initWithArray:(Color[])colors { 
    if (self = [super init]) { 
     _array = [[NSMutableArray alloc] init]; 
     for (int i=0;colors[i]!=0;i++) 
      [_array addObject:[NSNumber numberWithInt:colors[i]]]; 
    } 
    return self; 
} 
- (void) dealloc { 
    [_array release]; 
    [super dealloc]; 
} 

- (void) addColor:(Color)color { 
    [_array addObject:[NSNumber numberWithInt:color]]; 
} 
- (Color) colorAtIndex:(int)i { 
    return [[_array objectAtIndex:i] intValue]; 
} 

@end 
Các vấn đề liên quan