像在java中一样重新定义objC的枚举

时间:2013-04-28 12:10:38

标签: objective-c enums

在java中这是可能的:

enum VisitSetting {
  NOT_VISITED,
  QUERIED_VISITED,
  CONFIRMED_VISITED
}

enum ExcludeSetting {
  NONE,
  QUERIED_VISITED_AND_CONFIRMED_VISITED,
  CONFIRMED_VISITED
}

请注意,CONFIRMED_VISITED也在ExcSetSetting中的VisitSetting中。

我想在目标c中使用simulair但我得到Redefinition of enumerator 'CONFIRMED_VISITED'

这是实施:

#ifndef RouteApp_IGConstants_h
#define RouteApp_IGConstants_h

typedef enum {
    NOT_VISITED = 0,
    QUERIED_VISITED,
    CONFIRMED_VISITED
} VisitSetting;

typedef enum {
    NONE = 0,
    QUERIED_VISITED_AND_CONFIRMED_VISITED,
    CONFIRMED_VISITED
} ExcludeSetting;



#endif

如何解决这个问题? 我希望不重命名CONFIRMED_VISITED。

3 个答案:

答案 0 :(得分:11)

在C中,因此在Objective-C中,枚举数位于全局命名空间中。因此,您不能在两个枚举中使用相同的枚举器。您必须在Objective-C中重命名至少一个CONFIRMED_VISITED枚举器。通常,我们为枚举的每个成员使用公共前缀,如下所示:

typedef enum {
    VisitSettingNotVisited = 0,
    VisitSettingQueried,
    VisitSettingConfirmed
} VisitSetting;

typedef enum {
    ExcludeSettingNone = 0,
    ExcludeSettingQueriedAndConfirmed,
    ExcludeSettingConfirmed
} ExcludeSetting;

如果您愿意使用Objective-C ++ ,则可以使用enum class。这是一个新的C ++特性,在普通C中没有等效的。

enum class VisitSetting {
  NOT_VISITED,
  QUERIED_VISITED,
  CONFIRMED_VISITED
};

enum class ExcludeSetting {
  NONE,
  QUERIED_VISITED_AND_CONFIRMED_VISITED,
  CONFIRMED_VISITED
};

// Example usage:
VisitSetting vs = VisitSetting::CONFIRMED_VISITED;
ExcludeSetting es = ExcludeSetting::CONFIRMED_VISITED;

Xcode 4.6.2支持此C ++ 11功能。旧版本可能支持它;我不知道。

答案 1 :(得分:1)

你无法改变:/

你通常做的是在enum值前加上enum的值(哦,你使用驼峰的名字)

所以

typedef enum {
    VisitSettingNot = 0,
    VisitSettingQueried,
    VisitSettingConfirmed
} VisitSetting;

typedef enum {
    ExcludeSettingNone = 0,
    ExcludeSettingQueriedAndConfirmed,
    ExcludeSettingConfirmed
} ExcludeSetting;

答案 2 :(得分:0)

你做不到。 它是C而不是对象。 在C语言中,枚举只不过是一种方便的方式来创建和火热最小化一些整数。 给出的名称是分配给C中的整数的名称。 你可以做到这一点,有效地实现类似的东西,你可以简单地将一个枚举成员分配给CONFIRM_VISITED,给它们相同的整数值,并允许你在相同的情况下使用它。

您会注意到的一件事是Cocoa框架倾向于在枚举成员名称前加上前缀,因此它们会获得伪命名空间和一些上下文清晰度。 在这个样式中,你将有两个具有相同值的整数但是这样命名... VisitSettingCONFIRM_VISITED ExcludeSettingCONFIRM_VISITED

更常见的风格是所有骆驼案例。

VisitSettingConfirmVisited ExcludeSettingConfirmVisited

显然,如果有足够的重叠,将它们合并到一个名称相应的单个枚举中可能是有意义的。

另外,不要错过NS_ENUM工具来创建它们。很方便。