像java一样为objC重新定义枚举



在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工具。非常方便。

最新更新