从枚举派生字符串的方法



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

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

我很好奇是否有比这更简洁的方法来派生字符串

编辑:我还在其他地方使用相同的enum来接口不同的系统,该系统需要将相同的enum映射到不同的字符串集。

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

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脚本来从文本文件生成代码——它生成用于将字符串转换为enum的GPerf输出,并生成用于将enum转换为字符串的代码。C语言不做反射

最新更新