NS_OPTIONS位掩码自动生成

时间:2013-06-18 18:31:27

标签: ios objective-c enums bitflags

我有一个大的枚举(为了透明度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)
}

这是一个勉强适当的解决方案,当我删除枚举(至少我得到一个编译错误),如果枚举顺序改变,标志的位移位置也改变(不是它真的很重要,但它似乎令人欣慰)。但它并没有解决“这是一个很多打字”的问题,也没有解决“如果我忘了添加一个标志”的问题。

2 个答案:

答案 0 :(得分: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
}

答案 1 :(得分: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形式的标记。