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

cla*_*l3r 2 enums objective-c

在java中这是可能的:

enum VisitSetting {
  NOT_VISITED,
  QUERIED_VISITED,
  CONFIRMED_VISITED
}

enum ExcludeSetting {
  NONE,
  QUERIED_VISITED_AND_CONFIRMED_VISITED,
  CONFIRMED_VISITED
}
Run Code Online (Sandbox Code Playgroud)

请注意,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
Run Code Online (Sandbox Code Playgroud)

怎么解决这个问题?我希望不重命名CONFIRMED_VISITED.

rob*_*off 11

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

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

typedef enum {
    ExcludeSettingNone = 0,
    ExcludeSettingQueriedAndConfirmed,
    ExcludeSettingConfirmed
} ExcludeSetting;
Run Code Online (Sandbox Code Playgroud)

如果您愿意使用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;
Run Code Online (Sandbox Code Playgroud)

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