【问题标题】:Objective-C : enum like Java (int values and many others for each enum)Objective-C : enum like Java (int values and many others for each enum)
【发布时间】:2011-01-01 23:40:47
【问题描述】:

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

我想在 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 文件中没有使用的“颜色值”...

你能帮我吗?

【问题讨论】:

    标签: java objective-c enums global


    【解决方案1】:

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

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

    进入您的.m 文件之一,并将标题更改为:

    extern int colourValues[];
    

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

    extern NSArray *colorNames;
    

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

    【讨论】:

    • 我不确定。如果我将中间行放入 .m 文件中,枚举及其对应的值将不在同一个文件中?
    • @Olivier,如果你愿意,你可以使用#define 来解决这个问题。不过,我不确定您的预期设计是否是一个好主意。
    • 当然,不确定设计是否完美,但有时使用史前语言可能需要付出代价。在我看来,将相同的东西放在同一个地方是保持代码清晰的好方法,最重要的是,尽可能避免错误。
    • @Olivier:Java 和 Objective-C 只是我们必须应对的两种不同的语言。我也来自 Java 并学习 Objective-C。自从几十年前学习 C 和 C++ 以来,我也忘记了语法和头文件的问题......我们只需要像对待小狗一样“驯服”这种语言,接受他的差异并接受没电了!新年快乐,编码快乐!
    • @LudoMC :你说过 :-) 不同的语言。但目前,我只看到泄漏,没有看到很多功能......如果有的话,平衡泄漏一定很棒:-) 也祝你新年快乐,可能会有很棒的代码出现在你身上2011 年在 AppStore 上 ;-)
    【解决方案2】:

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

    另外,你不能在方法之外写[NSArray arrayWithObjects…]。那里只允许使用静态初始化器(即可以在编译时确定的值),而类似的消息仅在运行时解析。解决方案是将赋值转移到初始化函数中(例如,init 用于单例,initialize 用于类)。

    【讨论】:

    • OK... 我打算写:#define kMyColorValue blabla, bla, blablabla int he .h,然后在.m 中使用#define 这样枚举及其对应的值将保持在同一个地方。我试试……
    • @Oliver:我想你误解了。我要说的是,你不应该在标题中写int foo = 5。您将在标题中写入extern int foo,然后在实现文件中写入int foo = 5
    • 是的,我理解(我认为)你所说的,但它给了我另一个想法。
    • 我发现了一些有趣的东西来解决这个问题。请参阅我的下一篇文章。
    【解决方案3】:

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

    在 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 风格的枚举实现。 哇,两周的搜索……

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      相关资源
      最近更新 更多