原始 想法 和 实现 由 Benedict Cohen 提供。
JREnum 是一个宏,它自动创建函数,将令人厌烦的原始的编译时环境中的枚举吹送到运行时充满乐趣的环境。
让我们用一个具体的例子来说明。您不需要写成:
typedef enum {
Stream_Disconnected,
Stream_Connecting,
Stream_Connected,
Stream_Disconnecting
} StreamState;
请写成
JREnum(StreamState,
Stream_Disconnected,
Stream_Connecting,
Stream_Connected,
Stream_Disconnecting);
这将生成之前的 typedef enum
,并且还会生成一个相应的函数套件
NSString* StreamStateToString(int value)
给定一个值,将返回枚举的字符串表示形式。例如 StreamStateToString(2)
将返回 @"Stream_Connecting"
。
当遇到不在枚举中定义的值时,此函数将返回一个占位符字符串来解释该情况。例如 StreamStateToString(2000)
将返回 @"<unknown StreamState: 2000>"
。
BOOL StreamStateFromString(NSString *enumLabel, StreamState *enumValue)
尝试根据枚举的标签返回枚举的 int
值。例如 StreamStateFromString(@"Stream_Disconnecting", &value)
将返回 YES
并将 value
设置为 3
。
如果枚举类型的标签未知,则此函数返回 NO
。例如 StreamStateFromString(@"lackadaisical", &value)
将返回 NO
并不改变 value
。
NSDictionary* StreamStateByValue()
返回一个字典,其键是枚举的值。由 StreamStateToString() 使用。
当枚举具有多个重叠的值时,当前实现显示最后写入覆盖行为。
NSDictionary* StreamStateByLabel()
返回一个字典,其键是枚举的标签。由 StreamStateFromString() 使用。如果您想在运行时枚举枚举的标签和值,则这是一个您想要的函数。
JREnum() 对于当您有一个仅存在于 .m 文件中的枚举时是足够的。但是,如果您在头文件中暴露一个枚举,您必须使用备选宏。在您的 .h 文件中使用 JREnumDeclare()
JREnumDeclare(StreamState,
Stream_Disconnected,
Stream_Connecting,
Stream_Connected,
Stream_Disconnecting);
然后在您的 .m 文件中使用 JREnumDefine()
JREnumDefine(StreamState);
您还可以显式定义枚举整数值
JREnum(StreamState,
Stream_Disconnected = 42,
Stream_Connecting,
Stream_Connected,
Stream_Disconnecting);
在上面的场景中,Stream_Disconnected
的值将是 42
,Stream_Connecting
的值将是 43
等等。
JREnum 目前仅支持整数显式值(位操作和掩码将不起作用)。欢迎补丁。