在NSArray中存储枚举?

5

我刚接触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个回答

14

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

原生的C类型在Cocoa集合类中真正是二等公民,并且如果你想交错使用,它们通常很冗长。C语言表示枚举具有整数值,因此以这种方式将它们用作整数是安全的。

当然,根据您正在进行的操作,您可以通过将该枚举包装在实际对象(“MyColor”)中并将其作为其属性来简化操作代码。这些对象可以随意在集合类中传递,其中一些前期和运行时开销可能不会对性能产生影响,具体取决于您正在做什么。


有没有一个好的 Obj-C 类型,可以在 switch...case 中使用,并且也可以放入 NSArray 中? - joerick
@joerick:NSNumber可以与switch语句一起使用:switch([myNsNumber intValue]) ... - Georg Fritzsche
2
严格来说,NSNumber对象不能与switch语句一起使用。如Georg所提供的方法,可以通过请求NSNumber对象的值作为int,然后将其用于switch语句。 - Peter Hosey

1

你可能正在寻找一种简单地循环遍历所有选项的方法?那使用一个普通的数组怎么样?

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

0

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

vector<colorEnumClass> supportedColours

你可以为这个类添加方法来测试颜色是否是向量的成员,然后你可以在IF语句中使用该方法而不是使用关系运算符进行明确的测试。这样写代码更清晰明了 :-)

注意,supportedColours这个名称暗示了这个向量应该是一个常量,在程序启动时定义并且永远不会改变。如果是这种情况,那么向量中的"colours"应该在构造函数中设置,并且永远不会改变。这个类应该实现为单例,并且你甚至可以重写pushback()等向量操作符以阻止修改。

这是"Java新的枚举技术的性质。

我还要提到,对于Objective C我还是太新了,无法提供一个语法上正确的代码示例...抱歉。


2
这个问题并不是关于 C++ 的解决方案 - vector<colorEnumClass> 是他想在 ObjC 中实现的一个 C++ 示例。 - Georg Fritzsche

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接