可以将另一个项添加到现有的枚举类型中吗?

时间:2010-06-26 13:25:57

标签: objective-c c cocoa-touch enums

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

这样的事情:我们有enum类型

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

现在我想添加或添加像UIModalTransitionStyleCoverVerticalFlipped这样的项目。 可以完成这样的事情吗?

4 个答案:

答案 0 :(得分:16)

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

extern const UIModalTransitionStyle UIModalTransitionStyleCoverVerticalFlipped;

实施档案:

const UIModalTransitionStyle UIModalTransitionStyleCoverVerticalFlipped = 10;

确保在框架扩展的情况下提供一些空间,以便您不会发生冲突。这有点像黑客,但它将摆脱编译器错误和警告。

答案 1 :(得分:8)

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

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

否则,您可以抓住机会不工作,并单独定义:

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

typedef enum { 
    UIModalTransitionStyleCoverVerticalFlipped =
        UIModalTransitionStylePartialCurl + 1
} ExtendedUIModalTransitionStyle;

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

答案 2 :(得分:1)

也许这可以帮到你:

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时,感觉很奇怪。

答案 3 :(得分:0)

要执行此操作,您必须更新Enum声明以包含UIModalTransitionStyleCoverVerticalFlipped此值以及

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

所以UIModalTransitionStyleCoverVerticalFlipped将等于整数常量4

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