【问题标题】:Redefinition of enumeration for objC like in java像在java中一样重新定义objC的枚举
【发布时间】:2013-04-28 12:10:38
【问题描述】:

在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。

【问题讨论】:

    标签: objective-c enums


    【解决方案1】:

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

    【讨论】:

    • 当我应用您的解决方案时,xcode 会强制我在枚举名称后加上分号,即enum class VisitSetting; ,这使我的枚举值变得毫无意义。你知道为什么会这样吗?
    【解决方案2】:

    你不能改变它:/

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

    所以

    typedef enum {
        VisitSettingNot = 0,
        VisitSettingQueried,
        VisitSettingConfirmed
    } VisitSetting;
    
    typedef enum {
        ExcludeSettingNone = 0,
        ExcludeSettingQueriedAndConfirmed,
        ExcludeSettingConfirmed
    } ExcludeSetting;
    

    【讨论】:

      【解决方案3】:

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

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

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

      VisitSettingConfirmVisited 排除设置确认已访问

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

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

      【讨论】:

        猜你喜欢
        • 2017-10-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多