【发布时间】:2013-06-18 18:31:27
【问题描述】:
我有一个很大的枚举(为了透明起见 63 个值),我现在正在基于该枚举创建一个 NS_Options 位标志。有没有一种方法可以让我编写它以使其灵活?
我对硬编码的主要担忧是:
- 如果我添加/删除一个枚举,我将不得不在我的 bitflag 中手动添加/删除它。
- 需要大量输入才能生成这些内容。
- 我的 .h 文件变得非常长(因为我喜欢使用空格和足够的 cmets)
到目前为止,我想出的唯一解决方案是:
#define FlagForEnum(enum) 1 << enum
typedef NS_ENUM(NSInteger, ExampleEnum)
{
Value1,
Value2,
...
ValueN
}
typedef NS_OPTIONS(NSNumber, ExampleEnumFlags)
{
Value1Flag = FlagForEnum(Value1),
Value2Flag = FlagForEnum(Value2),
...
ValueNFlag = FlagForEnum(ValueN)
}
当我删除一个枚举(至少我得到一个编译错误)时,这是一个勉强足够的解决方案,如果枚举顺序发生变化,标志的位移位置也会发生变化(这并不重要,但它似乎令人欣慰)。但它并不能解决“大量输入”的问题,或者“如果我忘记添加标志会怎样”的问题。
【问题讨论】:
-
不是你的问题的答案,但 Go 有一个巧妙的方法:golang.org/ref/spec#Iota
-
您对一些代码生成(例如快速 Python 脚本)有何感想?
-
@JoshBleecherSnyder 代码生成似乎是合理的;绝对比我的预处理器代码更可重用。
标签: ios objective-c enums bitflags