枚举值到NSString(iOS)

Oha*_*gev 64 enums nsstring ios

我有一个包含几个值的枚举:

枚举{value1,value2,value3} myValue;

在我的应用程序中的某个点,我希望检查枚举的哪个值现在处于活动状态.我正在使用NSLog,但我不清楚如何显示枚举的当前值(value1/valu2/valu3/etc ...)作为NSLog的NSString.

任何人?

Mar*_*ire 85

我不喜欢将枚举放在堆上,而不提供用于转换的堆函数.这是我想出的:

typedef enum {value1, value2, value3} myValue;
#define myValueString(enum) [@[@"value1",@"value2",@"value3"] objectAtIndex:enum]
Run Code Online (Sandbox Code Playgroud)

这使得枚举和字符串声明保持紧密,以便在需要时轻松更新.

现在,在代码中的任何位置,您都可以像这样使用枚举/宏:

myValue aVal = value2;
NSLog(@"The enum value is '%@'.", myValueString(aVal));

outputs: The enum value is 'value2'.
Run Code Online (Sandbox Code Playgroud)

为了保证元素索引,您始终可以显式声明开始(或全部)枚举值.

enum {value1=0, value2=1, value3=2};
Run Code Online (Sandbox Code Playgroud)


bad*_*key 55

这里回答:关于实施的一些建议

底线Objective-C是使用常规的旧的C enum,这只是一组美化的整数.

给出enum这样的:

typedef enum { a, b, c } FirstThreeAlpha;
Run Code Online (Sandbox Code Playgroud)

你的方法看起来像这样:

- (NSString*) convertToString:(FirstThreeAlpha) whichAlpha {
    NSString *result = nil;

    switch(whichAlpha) {
        case a:
            result = @"a";
            break;
        case b:
            result = @"b";
            break;
        case c:
            result = @"c";
            break;

        default:
            result = @"unknown";
    }

    return result;
}
Run Code Online (Sandbox Code Playgroud)


Han*_* Ko 34

我将介绍我使用的方式,它看起来比以前的答案更好.(我认为)

我想用UIImageOrientation来说明以便于理解.

typedef enum {
    UIImageOrientationUp = 0,            // default orientation, set to 0 so that it always starts from 0
    UIImageOrientationDown,          // 180 deg rotation
    UIImageOrientationLeft,          // 90 deg CCW
    UIImageOrientationRight,         // 90 deg CW
    UIImageOrientationUpMirrored,    // as above but image mirrored along other axis. horizontal flip
    UIImageOrientationDownMirrored,  // horizontal flip
    UIImageOrientationLeftMirrored,  // vertical flip
    UIImageOrientationRightMirrored, // vertical flip
} UIImageOrientation;
Run Code Online (Sandbox Code Playgroud)

创建一个方法,如:

NSString *stringWithUIImageOrientation(UIImageOrientation input) {
    NSArray *arr = @[
    @"UIImageOrientationUp",            // default orientation
    @"UIImageOrientationDown",          // 180 deg rotation
    @"UIImageOrientationLeft",          // 90 deg CCW
    @"UIImageOrientationRight",         // 90 deg CW
    @"UIImageOrientationUpMirrored",    // as above but image mirrored along other axis. horizontal flip
    @"UIImageOrientationDownMirrored",  // horizontal flip
    @"UIImageOrientationLeftMirrored",  // vertical flip
    @"UIImageOrientationRightMirrored", // vertical flip
    ];
    return (NSString *)[arr objectAtIndex:input];
}
Run Code Online (Sandbox Code Playgroud)

你所要做的就是:

  1. 命名你的功能.

  2. 复制enum的内容并粘贴在NSArray*arr = @ []之间; return(NSString*)[arr objectAtIndex:input];

  3. 把一些@,"和逗号

  4. 利润!!!!

  • 脆弱的方式...你的枚举值从0开始以1为增量 (6认同)
  • 如果您没有从0递增,请使用查找字典,例如`@ {@(MyEnumValue1):@"MyEnumValue1"}`.这适用于所有情况. (3认同)

Ger*_*eri 29

这将由编译器验证,因此您不会意外混淆索引.

NSDictionary *stateStrings =
 @{
   @(MCSessionStateNotConnected) : @"MCSessionStateNotConnected",
   @(MCSessionStateConnecting) : @"MCSessionStateConnecting",
   @(MCSessionStateConnected) : @"MCSessionStateConnected",
  };
NSString *stateString = [stateStrings objectForKey:@(state)];
Run Code Online (Sandbox Code Playgroud)

var stateStrings: [MCSessionState: String] = [
    MCSessionState.NotConnected : "MCSessionState.NotConnected",
    MCSessionState.Connecting : "MCSessionState.Connecting",
    MCSessionState.Connected : "MCSessionState.Connected"
]
var stateString = stateStrings[MCSessionState.Connected]
Run Code Online (Sandbox Code Playgroud)


ajm*_*all 13

我找到了这个网站(从中获取了以下示例),它为这个问题提供了一个优雅的解决方案.最初的帖子来自StackOverflow的回答.

// Place this in your .h file, outside the @interface block
typedef enum {
    JPG,
    PNG,
    GIF,
    PVR
} kImageType;
#define kImageTypeArray @"JPEG", @"PNG", @"GIF", @"PowerVR", nil

...

// Place this in the .m file, inside the @implementation block
// A method to convert an enum to string
-(NSString*) imageTypeEnumToString:(kImageType)enumVal
{
    NSArray *imageTypeArray = [[NSArray alloc] initWithObjects:kImageTypeArray];
    return [imageTypeArray objectAtIndex:enumVal];
}

// A method to retrieve the int value from the NSArray of NSStrings
-(kImageType) imageTypeStringToEnum:(NSString*)strVal
{
    NSArray *imageTypeArray = [[NSArray alloc] initWithObjects:kImageTypeArray];
    NSUInteger n = [imageTypeArray indexOfObject:strVal];
    if(n < 1) n = JPG;
    return (kImageType) n;
}
Run Code Online (Sandbox Code Playgroud)


Les*_*ary 6

在某些情况下,当你需要转换enum - > NSString和NSString - > enum时,使用typedef和#define(或const NSStrings)而不是enum可能更简单:

typedef NSString *        ImageType;
#define ImageTypeJpg      @"JPG"
#define ImageTypePng      @"PNG"
#define ImageTypeGif      @"GIF"
Run Code Online (Sandbox Code Playgroud)

然后像任何其他NSString一样使用"命名"字符串操作:

@interface MyData : NSObject
@property (copy, nonatomic) ImageType imageType;
@end

@implementation MyData
- (void)doSomething {
    //...
    self.imageType = ImageTypePng;
    //...
    if ([self.imageType isEqualToString:ImageTypeJpg]) {
        //...
    }
}
@end
Run Code Online (Sandbox Code Playgroud)


JVi*_*lla 6

如果我可以提供另一种具有类型检查额外好处的解决方案,如果您在转换,可读性和简洁性中缺少枚举值,则会发出警告.

对于您的示例:typedef enum { value1, value2, value3 } myValue;您可以这样做:

NSString *NSStringFromMyValue(myValue type) {
    const char* c_str = 0;
#define PROCESS_VAL(p) case(p): c_str = #p; break;
    switch(type) {
            PROCESS_VAL(value1);
            PROCESS_VAL(value2);
            PROCESS_VAL(value3);
    }
#undef PROCESS_VAL

    return [NSString stringWithCString:c_str encoding:NSASCIIStringEncoding];
}
Run Code Online (Sandbox Code Playgroud)

作为旁注.这是一种更好的方法来声明你的枚举:

typedef NS_ENUM(NSInteger, MyValue) {
    Value1 = 0,
    Value2,
    Value3
}
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您可以获得类型安全性(NSInteger在这种情况下),您可以设置预期的枚举偏移量(= 0).


Boo*_*any 5

下面的解决方案使用预处理器的 stringize 运算符,从而提供更优雅的解决方案。它让您可以在一处定义枚举术语,以提高对错别字的恢复能力。

首先,按以下方式定义您的枚举。

#define ENUM_TABLE \
X(ENUM_ONE),    \
X(ENUM_TWO)    \

#define X(a)    a
typedef enum Foo {
    ENUM_TABLE
} MyFooEnum;
#undef X

#define X(a)    @#a
NSString * const enumAsString[] = {
    ENUM_TABLE
};
#undef X
Run Code Online (Sandbox Code Playgroud)

现在,按以下方式使用它:

// Usage
MyFooEnum t = ENUM_ONE;
NSLog(@"Enum test - t is: %@", enumAsString[t]);

t = ENUM_TWO;
NSLog(@"Enum test - t is now: %@", enumAsString[t]);
Run Code Online (Sandbox Code Playgroud)

输出:

2014-10-22 13:36:21.344 FooProg[367:60b] Enum test - t is: ENUM_ONE
2014-10-22 13:36:21.344 FooProg[367:60b] Enum test - t is now: ENUM_TWO
Run Code Online (Sandbox Code Playgroud)

@pixel 的回答为我指明了正确的方向。