2010-06-26 61 views
18

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

事情是这样的:我们有enum

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

现在我想追加或添加到此设置的项目像UIModalTransitionStyleCoverVerticalFlipped。 可以这样做吗?

+0

如果你有框架的来源,你可以做这个和你喜欢的任何其他修改。 – ognian 2010-06-26 13:45:00

+0

你想做什么是非常有意义的。不幸的是,枚举不能真正在外部扩展,例如,类可以是(通过继承等等)。 – apollodude217 2010-06-26 14:16:32

回答

8

要做到这一点,你必须修改原始类型的定义,包括新的价值:

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

否则,你可以承担其没有工作机会,并单独定义它:

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

typedef enum { 
    UIModalTransitionStyleCoverVerticalFlipped = 
     UIModalTransitionStylePartialCurl + 1 
} ExtendedUIModalTransitionStyle; 

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

+0

感谢您的两种可能的方法。我会和第二个一起去。 – user325746 2010-06-26 14:53:21

+0

@Jerry方法2假设在未来的SDK版本中,Apple将不会在UIModalTransitionStylePartialCurl后面添加其他类型,然后您会得到冲突。 – pnizzle 2015-07-02 03:29:56

+0

@pnizzle:是的,这就是我为什么特别说的原因之一:“你可以借此机会不工作......” – 2015-07-02 06:34:37

0

要做到这一点,你必须更新枚举声明包括UIModalTransitionStyleCoverVerticalFlipped这个值以及

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

所以UIModalTransitionStyleCoverVerticalFlipped将相当于徘徊无论你使用任何字符串从枚举DEC中恒以整型常量4

。对应的常数值被替换,所以它被用来限制变量只保存指定的一组值(即0到4)在上述情况下

14

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

extern const UIModalTransitionStyle UIModalTransitionStyleCoverVerticalFlipped; 

实现文件:

const UIModalTransitionStyle UIModalTransitionStyleCoverVerticalFlipped = 10; 

确保给予一定空间的情况下,框架被延长,让你没有冲突。这有点破解,但它会摆脱编译器错误和警告。

+1

plus1确保给一些空间 – pnizzle 2015-07-02 03:30:46

0

也许这可以帮助你:

typedef NS_ENUM(NSInteger, BaseType) { 
    BaseTypeCase1, 
    BaseTypeCase2, 
    BaseTypeSize 
}; 

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

现在你可以在子类型知道值是唯一的切换。

如果你没有获得基类型,你可以设置SubTypeCase1到BASETYPE的最后一个项目+ 1

坏处是,你不能宣布采取型的方法,并传递给它的基类型,而不得到一个编译器警告。所以你需要声明你的方法来使用NSInteger来沉默这个警告。

相关问题