objective-c - 从枚举派生字符串的方法

标签 objective-c c

我一直想知道是否有一种优雅的方法可以从 Objective-C 或普通 C 中的枚举派生字符串。我目前正在使用这样的 switch 语句:

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

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

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

最佳答案

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

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 不进行反射。

关于objective-c - 从枚举派生字符串的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6798549/

相关文章:

c - 为什么更多的 x86 指令比更少的更快?

ios - 魔法记录: Calculate data with calculations

iphone - 是否可以更改应用程序商店中应用程序的目标设备系列?

iphone - 细节披露按钮和 Segues

c - 如何从 C 运行外部程序并解析其输出?

c++ - collect2.exe [错误] ld 返回 1 退出状态

ios - 一次关闭所有 View Controller

objective-c - 如何删除 "implicit conversion loses integer precision: ' NSInteger'(又名 'long')到 'int' 的 100 条警告“我在更新到 arm64 后收到?

c - allegro 中按键事件的错误

c - cryptsetup中dm_task_create的实现在哪里?