我有一个大的枚举(为了透明度63值),我现在正在创建一个基于该枚举的NS_Options位标志。有没有办法可以写出来这样灵活?
我对硬编码的主要担忧是:
到目前为止,我提出的唯一解决方案是:
#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)
}
这是一个勉强适当的解决方案,当我删除枚举(至少我得到一个编译错误),如果枚举顺序改变,标志的位移位置也改变(不是它真的很重要,但它似乎令人欣慰)。但它并没有解决“这是一个很多打字”的问题,也没有解决“如果我忘了添加一个标志”的问题。
答案 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)
}
这将创建Value1Flag
,Value2Flag
,...,ValueNFlag
形式的标记。