NS_OPTIONS位掩码自动生成

3

我有一个很大的枚举(为了更加透明,它包含63个值),现在我正在基于该枚举创建一个 NS_Options 位标志。有没有一种方法可以编写它以使其更具灵活性?

我对硬编码的主要担忧是:

  • 如果我添加/删除一个枚举,则必须手动添加/删除它。
  • 生成这些需要输入大量字符。
  • 我的 .h 文件变得异常冗长(因为我喜欢使用空格和充足的注释)

到目前为止,我唯一想到的解决方法是:

#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 语言对此有一个很好的方法:http://golang.org/ref/spec#Iota - Josh Bleecher Snyder
你对代码生成(例如快速编写一个 Python 脚本)有什么感觉? - Josh Bleecher Snyder
@JoshBleecherSnyder 代码生成似乎是合理的;肯定比我的预处理器代码更具可重用性。 - paulrehkugler
2个回答

2
您可以使用一种名为X宏的技术。
#define VALUES \
  VALUE_LINE(Value1) \
  VALUE_LINE(Value2) \
  VALUE_LINE(Value3)

typedef NS_ENUM(NSUInteger, ExampleEnum)
{
#define VALUE_LINE(x) x,
VALUES
#undef VALUE_LINE
}

typedef NS_OPTIONS(NSUInteger, ExampleEnumFlags)
{
#define VALUE_LINE(x) x##Flag = 1 << x,
VALUES
#undef VALUE_LINE
}

0

这里有一个稍微好一点(在输入更少的情况下)的预处理器#define解决方案。虽然这仍然不如我所希望的那么优雅。

#define BitShift(ENUM_ATTRIBUTE)            (1 << ENUM_ATTRIBUTE)
#define CreateEnumFlag(ENUM_ATTRIBUTE)      ENUM_ATTRIBUTE##Flag = BitShift(ENUM_ATTRIBUTE)

typedef NS_ENUM(NSUInteger, ExampleEnum)
{
    Value1,
    Value2,
    ...
    ValueN
}

typedef NS_Options(NSUInteger, ExampleEnumFlags)
{
    CreateEnumFlag(Value1),
    CreateEnumFlag(Value2),
    ...
    CreateEnumFlag(ValueN)
}

这将创建形如 Value1FlagValue2Flag、...、ValueNFlag 的标志。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接