是否可以将另一项添加到现有的枚举类型?
我想知道是否可以添加/追加另一个项目到现有的枚举类型(框架的一部分)?是否可以将另一项添加到现有的枚举类型?
事情是这样的:我们有enum
型
typedef enum {
UIModalTransitionStyleCoverVertical = 0,
UIModalTransitionStyleFlipHorizontal,
UIModalTransitionStyleCrossDissolve,
UIModalTransitionStylePartialCurl,
} UIModalTransitionStyle;
现在我想追加或添加到此设置的项目像UIModalTransitionStyleCoverVerticalFlipped
。 可以这样做吗?
要做到这一点,你必须修改原始类型的定义,包括新的价值:
typedef enum {
UIModalTransitionStyleCoverVertical = 0,
UIModalTransitionStyleFlipHorizontal,
UIModalTransitionStyleCrossDissolve,
UIModalTransitionStylePartialCurl,
UIModalTransitionStyleCoverVerticalFlipped
} UIModalTransitionStyle;
否则,你可以承担其没有工作机会,并单独定义它:
typedef enum {
UIModalTransitionStyleCoverVertical = 0,
UIModalTransitionStyleFlipHorizontal,
UIModalTransitionStyleCrossDissolve,
UIModalTransitionStylePartialCurl,
} UIModalTransitionStyle;
typedef enum {
UIModalTransitionStyleCoverVerticalFlipped =
UIModalTransitionStylePartialCurl + 1
} ExtendedUIModalTransitionStyle;
,可以保持原有的枚举通常也完全正常工作的变量当/如果您分配了新的价值,以及(在典型情况下,这将只是一个int
) - 但它是不是有保证。至少在理论上,实现可以/可以分配足够的位来保持枚举,以这种方式添加更多的值将不起作用。它也可以进行范围检查,因此不允许指定任何超出范围值。这些都不常见,因此从实际的角度来看,这可能不是问题 - 但从理论的角度来看,没有什么能真正保证这样的代码可以工作。
感谢您的两种可能的方法。我会和第二个一起去。 – user325746 2010-06-26 14:53:21
@Jerry方法2假设在未来的SDK版本中,Apple将不会在UIModalTransitionStylePartialCurl后面添加其他类型,然后您会得到冲突。 – pnizzle 2015-07-02 03:29:56
@pnizzle:是的,这就是我为什么特别说的原因之一:“你可以借此机会不工作......” – 2015-07-02 06:34:37
要做到这一点,你必须更新枚举声明包括UIModalTransitionStyleCoverVerticalFlipped
这个值以及
typedef enum {
UIModalTransitionStyleCoverVertical = 0,
UIModalTransitionStyleFlipHorizontal,
UIModalTransitionStyleCrossDissolve,
UIModalTransitionStylePartialCurl,
UIModalTransitionStyleCoverVerticalFlipped
} UIModalTransitionStyle;
所以UIModalTransitionStyleCoverVerticalFlipped
将相当于徘徊无论你使用任何字符串从枚举DEC中恒以整型常量4
。对应的常数值被替换,所以它被用来限制变量只保存指定的一组值(即0到4)在上述情况下
您可以强制新元素具有与枚举相同的类型,但你不能在一个子类中扩展它。 头文件:
extern const UIModalTransitionStyle UIModalTransitionStyleCoverVerticalFlipped;
实现文件:
const UIModalTransitionStyle UIModalTransitionStyleCoverVerticalFlipped = 10;
确保给予一定空间的情况下,框架被延长,让你没有冲突。这有点破解,但它会摆脱编译器错误和警告。
plus1确保给一些空间 – pnizzle 2015-07-02 03:30:46
也许这可以帮助你:
typedef NS_ENUM(NSInteger, BaseType) {
BaseTypeCase1,
BaseTypeCase2,
BaseTypeSize
};
typedef NS_ENUM(NSInteger, SubType) {
SubTypeCase1 = BaseTypeSize,
SubTypeCase2
};
现在你可以在子类型知道值是唯一的切换。
如果你没有获得基类型,你可以设置SubTypeCase1到BASETYPE的最后一个项目+ 1
坏处是,你不能宣布采取型的方法,并传递给它的基类型,而不得到一个编译器警告。所以你需要声明你的方法来使用NSInteger来沉默这个警告。
如果你有框架的来源,你可以做这个和你喜欢的任何其他修改。 – ognian 2010-06-26 13:45:00
你想做什么是非常有意义的。不幸的是,枚举不能真正在外部扩展,例如,类可以是(通过继承等等)。 – apollodude217 2010-06-26 14:16:32