2

在java中这是可能的:

enum VisitSetting {
  NOT_VISITED,
  QUERIED_VISITED,
  CONFIRMED_VISITED
}

enum ExcludeSetting {
  NONE,
  QUERIED_VISITED_AND_CONFIRMED_VISITED,
  CONFIRMED_VISITED
}

请注意,CONFIRMED_VISITED 位于 VisitSetting 以及 ExcludeSetting 中。

我想要目标 c 中的一些类似的东西,但后来我得到了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。

4

3 回答 3

10

在 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 功能。旧版本可能支持它;我不知道。

于 2013-04-28T12:37:10.757 回答
1

你不能改变它:/

你通常做的是用枚举值作为枚举值的前缀(哦,你使用驼峰式命名)

所以

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

typedef enum {
    ExcludeSettingNone = 0,
    ExcludeSettingQueriedAndConfirmed,
    ExcludeSettingConfirmed
} ExcludeSetting;
于 2013-04-28T12:26:26.253 回答
0

你不能。它是 C 而不是对象。在 C 中,枚举只不过是一种方便的方法来创建和最小限度地关联一些整数。给定的名称是分配给 C 中整数的名称。您可以这样做,有效地实现类似的效果,您可以简单地将枚举成员分配给 CONFIRM_VISITED,给它们相同的整数值并允许您在相同的情况下使用它。

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

更常见的样式是全驼峰式。

访问SettingConfirmVisited 排除SettingConfirmVisited

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

此外,不要错过用于创建它们的 NS_ENUM 工具。很方便。

于 2013-04-28T12:36:23.077 回答