从枚举中导出字符串的方法

时间:2011-07-23 05:58:48

标签: objective-c c

我一直想知道是否有一种优雅的方式从Objective-C或vanilla C中的枚举中派生字符串。我目前正在使用这样的开关语句:

switch (self.requestType) 
{
    case MSListRequest:
        serverRequestType = @"List";
        break;
    case MSDetailsRequest:
        serverRequestType = @"Details";
        break;
    case MSPurchaseRequest:
        serverRequestType = @"PurchaseVolume";
        break;
}

我很好奇是否有更简洁的方法来推导字符串。

-edit: 我也在其他地方使用相同的枚举来连接到需要将相同枚举映射到不同字符串集的不同系统。

1 个答案:

答案 0 :(得分:0)

没有真正的漂亮的方法来做到这一点。一种非常简单的方法是创建一个数组:

NSString *const ENUM_NAMES[] = {
    @"List", @"Details", @"PurchaseVolume", ...
};

有些替代方法使用宏和一些简单的预处理器黑客来定义来自同一来源的名称和枚举本身。但是,生成的代码更难以阅读。

// some_enum.def
X(List),
X(Details),
X(PurchaseVolume)

// some_enum.h
enum {
    #define X(x) x
    #include "some_enum.def"
    #undef X
};

// some_enum.c
char const *const ENUM_STRING[] = {
    #define X(x) #x
    #include "some_enum.def"
    #undef X
};

我不确定从预处理器生成NSString的最佳方法,是否可以在其中添加@或者使用(NSString *)CFSTR(x)更好。

当我需要这样的一堆代码时,我编写了一个Python脚本来从文本文件生成代码 - 它生成GPerf输出以将字符串转换为枚举,并生成用于将枚举转换为字符串的代码。普通老C不做反思。