0

在 c# 中,您声明一个枚举,并可以通过使用enumVariable.ToString("g") Objective-c 中的命令执行此操作来打印它的字面量

例如在 c# 中,我可以编写以下内容:

class Sample 
{
    enum Colors {Red, Green, Blue, Yellow = 12};

    public static void Main() 
    {
       Colors myColor = Colors.Yellow;
       Console.WriteLine("myColor.ToString(\"d\") = {0}", myColor.ToString("d"));         
       Console.WriteLine("myColor.ToString(\"g\") = {0}", myColor.ToString("g"));
   }
}

// This example produces the following results:
// myColor.ToString("d") = 12
// myColor.ToString("g") = Yellow

我知道我可以创建一个字符串数组来保存值或使用 switch case 编写一个函数,但这似乎是一个适合 1970 年编写的 ac 语言的解决方案:)

如果您知道一个优雅的解决方案,请告诉我。

4

3 回答 3

2

当开发人员想要从枚举值接收字符串时,最常见的情况是使用它(字符串)作为复杂对象(XML、JSON、URL 等)的值/键。

并非总是希望枚举值中的字符串完全相同。在 Objective-C 中,您应该使用映射。使用枚举中的键(包装在 NSNumber 中)和 NSString 类型的值创建 NSDictionary。

// your enum
enum
{
    kAPXStateOpened,
    kAPXStateClosed,
    kAPXStateUnknown
};
...

// static map
static NSDictionary *theStateMap = nil;
static dispatch_once_t theStateMapDispatch = 0;
dispatch_once(&theStateMapDispatch,
^{
    theStateMap = [NSDictionary dictionaryWithObjectsAndKeys:
                @"opened", [NSNumber numberWithInteger:kAPXStateOpened],
                @"closed", [NSNumber numberWithInteger:kAPXStateClosed],
                @"broken", [NSNumber numberWithInteger:kAPXStateUnknown],
                nil];
});

self.currentState = kAPXStateOpened;
NSString *theStringValueFromState = [theStateMap objectForKey:[NSNumber numberWithInteger:self.currentState]];
NSLog(theStringValueFromState); // "opened"
于 2013-02-27T13:26:29.163 回答
0

ObjC 中的枚举是具有一组已定义值的整数而不是对象。因此,它们有方法。可能有一些 C 函数可以处理枚举,但我不熟悉它们。(如果其他人知道他们会很感兴趣)。

因为枚举是整数,所以也可以将未定义的值放入使用枚举类型的变量中。

这是一个例子:

typedef enum {
    enumValueA,
    enumValueB
} EnumName;

// Useful when you want to define specific values.
typedef enum {
    enumX = 1, 
    enumY = 100
} AnotherEnum;

并在代码中:

EnumName x = enumValueA;

然而,这些也是有效的:

EnumName x = 0; // = enumValueA
EnumName x = 3; // Not defined in the enum.

所以枚举基本上是一种为一组特定的整数值使用类似英语的名称的方法。

要从中获取字符串以包含在 UI 和日志记录中,您需要手动将枚举值映射到字符串。枚举值提供索引的字符串数组相对容易放置。

于 2013-02-27T13:15:17.823 回答
0
int someInt = [NString stringWithFormat:@"%d",yourEnumVariable];
于 2013-02-27T13:44:56.957 回答