【问题标题】:Method for deriving a string from an enum从枚举中派生字符串的方法
【发布时间】:2011-07-23 14:19:01
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你认为宏更干净吗?您愿意使用多少预处理器功能?
  • 我宁愿不使用宏,我一般不喜欢使用预处理器,除非没有其他有效的处理方式。
  • 你可能想通读this

标签: objective-c c


【解决方案1】:

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

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

【讨论】:

  • 从枚举映射到 const 数组也是我的第一个想法,但它看起来并不特别优雅或易于维护。考虑到我正在使用的枚举只有 3 或 4 个值,我可能会坚持使用 switch 方法,除非有人想出一种优雅简单的方法来处理这个问题。
  • @Shinohara:这正是重点:没有优雅简单的方法可以做到这一点。不在 C 中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-28
  • 1970-01-01
  • 1970-01-01
  • 2017-07-14
相关资源
最近更新 更多