在java中这是可能的:
enum VisitSetting {
NOT_VISITED,
QUERIED_VISITED,
CONFIRMED_VISITED
}
enum ExcludeSetting {
NONE,
QUERIED_VISITED_AND_CONFIRMED_VISITED,
CONFIRMED_VISITED
}
注意CONFIRMED_VISITED在VisitSetting和exudessetting中都有
我想在objective 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
在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的这个特性。它可能在旧版本中得到支持;我不知道。
你不能改变:/
你通常要做的是在枚举的值前面加上枚举的值(哦,你使用驼峰大小写)
typedef enum {
VisitSettingNot = 0,
VisitSettingQueried,
VisitSettingConfirmed
} VisitSetting;
typedef enum {
ExcludeSettingNone = 0,
ExcludeSettingQueriedAndConfirmed,
ExcludeSettingConfirmed
} ExcludeSetting;
不能。它是C,而不是一个对象。在C语言中,枚举只不过是一种方便的方式,用于创建和最小程度地关联一些整数。给出的名称是C中分配给整数的名称。您可以这样做,有效地实现类似的功能,您可以简单地将一个enum成员分配给CONFIRM_VISITED,给它们相同的整数值,并允许您在相同的情况下使用它。
你会注意到的一件事是,Cocoa框架倾向于给enum成员名加上前缀,这样他们就得到了一个伪命名空间和一些上下文清晰度。在这种风格下,你会有两个值相同的整数,但命名为这样…VisitSettingCONFIRM_VISITEDExcludeSettingCONFIRM_VISITED
更常见的样式是全驼色大小写。
VisitSettingConfirmVisitedExcludeSettingConfirmVisited
显然,如果有足够的重叠,将它们合并为一个适当命名的枚举是有意义的。
另外,不要错过创建它们的NS_ENUM工具。非常方便。