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)
}

当我删除一个枚举(至少我得到一个编译错误)时,这是一个勉强足够的解决方案,如果枚举顺序发生了变化,标志的位移位置也会发生变化(并不是真的很重要,但看起来很舒服)。但它并没有解决“这是很多打字”的问题,或者“如果我忘记添加标志会怎样”的问题。

4

2 回答 2

2

您可以使用一种称为X Macro的技术

#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
}
于 2013-06-18T21:51:01.180 回答
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)
}

这将创建形式为Value1Flag, Value2Flag, ...,的标志ValueNFlag

于 2013-06-18T20:13:14.950 回答