【问题标题】:Objective C global constants with case/switch带有 case/switch 的 Objective C 全局常量
【发布时间】:2012-06-29 09:56:35
【问题描述】:

有没有什么方法可以在 Objective C 中使用全局 int 常量来在 case/switch 语句中工作?这里的技术 (http://stackoverflow.com/questions/538996/constants-in-objective-c) 让我可以在任何地方访问常量,但不允许我将它们放入 switch 语句中。

在.h中

FOUNDATION_EXPORT const int UNIT_IDLE;
FOUNDATION_EXPORT const int UNIT_DEFEND;

在.m

int const UNIT_IDLE = 0;
int const UNIT_DEFEND = 1;

错误是“表达式不是整数常量表达式”

【问题讨论】:

标签: objective-c ios constants switch-statement


【解决方案1】:

我认为您最好的选择是使用enum types。只需在头文件中声明一个类型,然后就可以在 switch 语句中使用它了。

class.h

typedef enum{
    kEditGameModeNewGame = 0,
    kEditGameModeEdit = 1
}eEditGameMode;

class.m

eEditGameMode mode = kEditGameModeEdit;

switch (mode) {
    case kEditGameModeEdit:
        // ...
        break;
    case kEditGameModeNewGame:
        // ...
        break;

    default:
        break;
}

祝你好运!

【讨论】:

  • 有没有办法在不同对象之间共享枚举?谢谢!
【解决方案2】:

当我在 switch 语句中使用常量时,我​​通常将枚举与 typedef 语句一起使用。

例如,这将在共享的 .h 文件中,例如 ProjectEnums.h:

enum my_custom_unit
{
    MyCustomUnitIdle    = 1,
    MyCustomUnitDefend  = 2
};
typedef enum my_custom_unit MyCustomUnit;

然后我可以在我的 .c、.m、.cpp 文件中使用类似于以下 switch 语句的代码:

#import "ProjectEnums.h"

- (void) useUnit:(MyCustomUnit)unit
{
    switch(unit)
    {
        case MyCustomUnitIdle:
        /* do something */
        break;

        case MyCustomUnitDefend:
        /* do something else */
        break;

        default:
        /* do some default thing for unknown unit */
        break;
    };
    return;
};

这还允许编译器在编译时验证传递给方法并在 switch 语句中使用的数据。

【讨论】:

  • 我有点密集,但是我可以从另一个对象访问枚举 my_custom_unit 吗?还是我必须复制粘贴枚举?我想要共享的常量。
  • @Andrew 您可以在共享头文件中声明枚举。我通常会创建一个名为 ProjectEnumerations.h 的文件,它包含在任何将使用枚举的源文件中。我更新了我的示例来演示。
  • 非常感谢!我错过了如何共享枚举的最后一部分。
【解决方案3】:

Official guideline 说您应该使用“具有整数值的相关常量组的枚举”。这可能会解决您的问题并改进代码。

【讨论】:

    猜你喜欢
    • 2022-06-16
    • 1970-01-01
    • 2012-01-07
    • 2017-08-14
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多