【问题标题】:Possible to add another item to an existing enum type?可以向现有枚举类型添加另一个项目吗?
【发布时间】:2011-03-08 15:07:49
【问题描述】:

我想知道是否可以向现有枚举类型(框架的一部分)添加/附加另一个项目?

类似这样:我们有 enum 类型

  typedef enum {  
    UIModalTransitionStyleCoverVertical = 0,  
    UIModalTransitionStyleFlipHorizontal,
    UIModalTransitionStyleCrossDissolve,
    UIModalTransitionStylePartialCurl,
 } UIModalTransitionStyle;  

现在我想在这个集合中追加或添加一个像UIModalTransitionStyleCoverVerticalFlipped 这样的项目。 这样的事情能做到吗?

【问题讨论】:

  • 如果你有框架的源代码,你可以做这个和任何你喜欢的修改。
  • 您想做的事非常有意义。不幸的是,枚举并不能真正地向外扩展,例如,类可以(通过继承等)。

标签: objective-c c cocoa-touch enums


【解决方案1】:

为此,您必须修改原始类型定义以包含新值:

typedef enum {  
    UIModalTransitionStyleCoverVertical = 0,  
    UIModalTransitionStyleFlipHorizontal,
    UIModalTransitionStyleCrossDissolve,
    UIModalTransitionStylePartialCurl,
    UIModalTransitionStyleCoverVerticalFlipped
} UIModalTransitionStyle;

否则,你可以冒险让它不起作用,并单独定义它:

typedef enum {  
    UIModalTransitionStyleCoverVertical = 0,  
    UIModalTransitionStyleFlipHorizontal,
    UIModalTransitionStyleCrossDissolve,
    UIModalTransitionStylePartialCurl,
} UIModalTransitionStyle;

typedef enum { 
    UIModalTransitionStyleCoverVerticalFlipped =
        UIModalTransitionStylePartialCurl + 1
} ExtendedUIModalTransitionStyle;

可以保存原始枚举的变量通常在/如果您也分配新值时也可以正常工作(在典型情况下,它只是一个int) -- 但它保证。至少在理论上,实现可以/可以分配足够少的位来保存枚举,以这种方式添加更多值是行不通的。它还可以进行范围检查,因此不允许分配 any 超出范围的值。这些都不常见,所以从实践的角度来看,这可能不是问题——但从理论的角度来看,没有什么能真正保证这样的代码可以工作。

【讨论】:

  • 感谢您提供两种可能的方法。我会选择第二个。
  • @Jerry 方法 2 假设 Apple 不会在未来的 SDK 版本中在 UIModalTransitionStylePartialCurl 之后添加其他类型,这样您就会遇到冲突。
  • @pnizzle:是的,这就是我特别说的(部分)原因:“你可以抓住它不工作的机会......”
  • 在以后的 Xcode 版本 (9.1) 中扩展枚举会给你一个警告Comparison of constant 'ScannerStatusNotInitialized' (-1) with expression of type 'ScannerStatus' (aka 'enum ScannerStatus') is always false,即使这不是真的。 @pnizzle,您可以将其定义为 Flipped = UIModalTransitionStylePartialCurl + 666,以增加您的机会,但您必须放弃自己的灵魂:|
【解决方案2】:

为此,您必须更新 Enum 声明以包含 UIModalTransitionStyleCoverVerticalFlipped 这个值

typedef enum {      
 UIModalTransitionStyleCoverVertical = 0,       
 UIModalTransitionStyleFlipHorizontal,     
 UIModalTransitionStyleCrossDissolve,     
 UIModalTransitionStylePartialCurl,     
 UIModalTransitionStyleCoverVerticalFlipped 
} UIModalTransitionStyle;

所以UIModalTransitionStyleCoverVerticalFlipped 将等价于整数常量 4

无论你在哪里使用 Enum dec 中的任何字符串常量。相应的常量值被替换,因此它用于约束变量在上述情况下仅保存指定的值集(即 0 到 4)

【讨论】:

    【解决方案3】:

    您可以强制新元素具有与枚举相同的类型,但您不能在子类中扩展它。 头文件:

    extern const UIModalTransitionStyle UIModalTransitionStyleCoverVerticalFlipped;
    

    实现文件:

    const UIModalTransitionStyle UIModalTransitionStyleCoverVerticalFlipped = 10;
    

    确保在扩展框架时留出一些空间,以免发生冲突。这有点小技巧,但它会消除编译器错误和警告。

    【讨论】:

    • plus1 确保留出一些空间
    【解决方案4】:

    也许这可以帮助你:

    typedef NS_ENUM(NSInteger, BaseType) {
        BaseTypeCase1,
        BaseTypeCase2,
        BaseTypeSize
    };
    
    typedef NS_ENUM(NSInteger, SubType) {
        SubTypeCase1 = BaseTypeSize,
        SubTypeCase2
    };
    

    现在您可以在知道值是唯一的情况下打开 SubType。

    如果您无权访问 BaseType,您可以将 SubTypeCase1 设置为 BaseType 的最后一项 + 1。

    缺点是,您不能声明一个采用 SubType 并将 BaseType 传递给它的方法,而不会收到编译器警告。因此,您需要声明采用 NSIntegers 的方法以使该警告静音。 另外,当你需要声明一个 SubType 的参数并且能够传入一个 BaseType 时,感觉很奇怪。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-08
      • 2017-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-29
      • 2011-08-17
      相关资源
      最近更新 更多