Objective-C:类似于Java的枚举(每个枚举的int值和许多其他值)

Objective-C:类似于Java的枚举(每个枚举的int值和许多其他值),java,objective-c,enums,global,Java,Objective C,Enums,Global,在Java中,可以使枚举具有多个值。 在objective-C中,这并非易事。 我已经阅读了很多关于这方面的文章,但是我没有发现任何令人满意的东西,可以让我以一种简单的方式使用enum,并将enum声明及其不同的值保存在同一个文件中 我想在enums中写一些类似的内容。h: // ======================================== typedef enum {eRED, eGREEN, eBLUE} ColorEnum; int colorValues[] = {

在Java中,可以使枚举具有多个值。 在objective-C中,这并非易事。 我已经阅读了很多关于这方面的文章,但是我没有发现任何令人满意的东西,可以让我以一种简单的方式使用enum,并将enum声明及其不同的值保存在同一个文件中

我想在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”被定义。 或者,如果我只是使用“static”,我有许多在.m文件中没有使用的“colorValue”


你能帮帮我吗?

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

int colorValues[] = { 0xFF0000, 0x00FF00, 0x0000FF };
将标题更改为以下内容:

extern int colourValues[];
您需要对
颜色名称
执行类似操作。将标题更改为:

extern NSArray *colorNames;

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

您已经接近-问题是您将数组的定义放在头文件中,多个编译单元最终会复制它。把你的话放在中间:

int colorValues[] = { 0xFF0000, 0x00FF00, 0x0000FF };
将标题更改为以下内容:

extern int colourValues[];
您需要对
颜色名称
执行类似操作。将标题更改为:

extern NSArray *colorNames;

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

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


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

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


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

我尝试了以下类似于符咒的方法:

在enums.h中 在enums.m中 在Objective-C中有一个完美的Java风格的枚举实现。
哇,两周的搜索……

我尝试了以下的东西,效果很好:

在enums.h中 在enums.m中 在Objective-C中有一个完美的Java风格的枚举实现。
哇,两周的搜索……

我不太明白。如果我将中间一行放在.m文件中,枚举及其对应的值将不在同一个文件中?@Olivier,如果需要,可以使用
#define
来修复该问题。不过,我不确定你的设计初衷是不是一个好主意。当然,我也不确定这个设计是否完美,但有时这可能是使用史前语言的代价。在我看来,将相同的东西放在同一个地方是保持代码清晰的好方法,最重要的是,尽可能避免bug。@Olivier:Java和Objective-C只是我们必须处理的两种不同的语言。我也来自java和学习ObjtoC.C,我也有一些语法和这个头文件,我从几十年前学会C++和C++以来就忘记了。我们只需要像对待小狗一样“驯服”这种语言,接受它的差异并从中汲取力量!新年快乐,编码快乐@卢多姆:你说的:-)不是同一种语言。但就目前而言,我只看到漏洞,没有太多的电力。。。如果有的话,平衡这些漏洞一定很好:-)也祝你新年快乐,愿AppStore在2011年为你提供最棒的代码;-)我不太明白。如果我将中间一行放在.m文件中,枚举及其对应的值将不在同一个文件中?@Olivier,如果需要,可以使用
#define
来修复该问题。不过,我不确定你的设计初衷是不是一个好主意。当然,我也不确定这个设计是否完美,但有时这可能是使用史前语言的代价。在我看来,将相同的东西放在同一个地方是保持代码清晰的好方法,最重要的是,尽可能避免bug。@Olivier:Java和Objective-C只是我们必须处理的两种不同的语言。我也来自java和学习ObjtoC.C,我也有一些语法和这个头文件,我从几十年前学会C++和C++以来就忘记了。我们只需要像对待小狗一样“驯服”这种语言,接受它的差异并从中汲取力量!新年快乐,编码快乐@卢多姆:你说的:-)不是同一种语言。但就目前而言,我只看到漏洞,没有太多的电力。。。如果有的话,平衡这些漏洞一定很好:-)也祝你新年快乐,愿AppStore在2011年为你提供最棒的代码;-)好啊我计划写:#在.h中定义kMyColorValue blabla,bla,blablabla,然后在.m中使用#define,这样枚举及其对应的值将保持在同一位置。奥利弗:我想你误解了。我想说的是,你不应该在头中写
intfoo=5
。你会写信的