Objective-C:像Java一样枚举(每个枚举的int值和许多其他值)

时间:2011-01-01 23:40:48

标签: java objective-c enums global

在Java中,您可以创建具有多个值的枚举。 在Objective-C中,这不容易做到。 我已经阅读了很多有关此内容的页面,但我没有找到任何令人满意的内容,这样我就可以通过简单的方式使用枚举,并且将枚​​举声明及其不同的值保存在同一个文件中。 / p>

我想在enums.h中写这样的东西:

// ========================================
typedef enum {eRED, eGREEN, eBLUE} ColorEnum;
int colorValues[] = { 0xFF0000, 0x00FF00, 0x0000FF };
NSArray *colorNames = [NSArray arrayWithObjects:@"Red color", @"light green", @"Deep blue", nil];
// ========================================

并能够使用全局变量管理我的东西,如:

int color = colorValues[eRED];

但我不知道怎么写这个。 我有编译错误,如“ColorValues”定义了很多次。 或者,如果我只使用“静态”,我在.m文件中没有使用许多“ColorValues”...

你能帮帮我吗?

3 个答案:

答案 0 :(得分:1)

你很接近 - 问题是你把数组的定义放在头文件中,其中多个编译单元最终复制它。把你的中间线:

int colorValues[] = { 0xFF0000, 0x00FF00, 0x0000FF };

到您的.m个文件中,并将标题更改为:

extern int colourValues[];

您需要执行与colorNames类似的操作。将标题更改为:

extern NSArray *colorNames;

然后声明实际对象并在.m文件中初始化它。

答案 1 :(得分:1)

你的问题与枚举无关。它是在标题中定义变量(而不仅仅是声明它们),这就是问题所在。只需在标头中声明它们并将实现移动到实现文件。

此外,您不能在方法之外编写[NSArray arrayWithObjects…]。在那里只允许静态初始值设定项(即,可以在编译时确定的值),而这样的消息仅在运行时解析。解决方案是将分配移动到初始化函数中(例如,init表示单例,或initialize表示类。)

答案 2 :(得分:1)

我尝试了以下像魅力一样的东西:

enums.h中的

@interface enums
    // here, the enum and its values are in the same place.

    typedef enum {eRED, eGREEN, eBLUE} ColorEnum;
    #define kColourValue  { 0xFF0000, 0x00FF00, 0x0000FF }
    extern int colourValues[];
@end
enums.m中的

@implementation enums
    int colorValues[] = kColourValue;
@end

你在Objective-C中有一个完美的Java样式枚举实现。 哇,两周的搜索......

相关问题