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)
你所要做的就是:
命名你的功能.
复制enum的内容并粘贴在NSArray*arr = @ [ 和 ]之间; return(NSString*)[arr objectAtIndex:input];
把一些@,"和逗号
利润!!!!
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)
在某些情况下,当你需要转换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)
如果我可以提供另一种具有类型检查额外好处的解决方案,如果您在转换,可读性和简洁性中缺少枚举值,则会发出警告.
对于您的示例: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).
下面的解决方案使用预处理器的 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 的回答为我指明了正确的方向。
| 归档时间: |
|
| 查看次数: |
103793 次 |
| 最近记录: |