将枚举存储在NSArray中?

时间:2010-07-03 16:21:25

标签: iphone objective-c cocoa

我是Objective-C的新手,但在C ++和C方面经验丰富。

我想在数组中存储一些枚举常量。在C ++中我会做这样的事情:

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

但是NSArray只会存储对象指针(id's)。那么它们应该如何存储?我可以将它们转换为整数并将它们存储在NSNumber对象中,但这看起来很混乱。

我想知道经验丰富的obj-c程序员做了什么?

3 个答案:

答案 0 :(得分:13)

将它们转换为整数并将它们存储在NSNumbers中。 :)

本地C类型实际上是Cocoa集合类中的第二类公民,如果要混合使用,它们通常很复杂。 C表示枚举具有整数值,因此以这种方式将它们用作整数是安全的。

根据您正在做的事情,您可以通过将枚举包装在以枚举作为属性的实际对象(“MyColor”)中来简化操作代码。然后可以根据需要在集合类中抛出这些对象,其中一些前期和运行时开销从执行的角度来看不太重要,具体取决于您正在做什么。

答案 1 :(得分:0)

我会创建一个新类来定义枚举,然后将支持的颜色实例化为

vector<colorEnumClass> supportedColours

然后,您可以执行以下操作:给出用于测试颜色的类方法,以查看它是否是向量的成员。然后,您可以在IF语句中使用该方法,而不是使用关系运算符进行显式测试。更清晰的编码: - )

注意supportColours这个名称表明这个向量应该是一个常量,在程序启动时定义,永远不会改变。如果是这种情况,则应在构造函数中设置向量中的“颜色”,并且永远不会更改。该类应该作为Singleton实现,你甚至可以覆盖pushback()等的向量运算符来阻止修改。

这属于"new" Java enumeration technology

的性质

我还应该提一下,我对Objective C来说太新了,无法提供语法正确的代码示例..抱歉。

答案 2 :(得分:0)

您可能正在寻找一种方法来简单地遍历所有选项?如何只是一个计划旧的正常数组?

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

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

另一方面,如果性能不是问题,而您只是想稍微清理一下代码;如何创建一个封装NSMutableArray并创建相关方法的ColorArray类。

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
相关问题