在C enum和XML之间转换

XML中存储枚举并再次读取它的最简洁方法是什么?说我有

enum etobjectType {ETnormalObjectType,ETRareObjectType,ETEssentialObjectType};

… …我想获取一个变量,枚举etobjectType objectType = ETnormalObjectType;,并将其转换为如下所示的XML:< objectType> ETnormalObjectType< / objectType>.

目前我正在做的是这样的:

Nsstring* const etobjectTypeAsstring[] = {@"ETnormalObjectType",@"ETRareObjectType",@"ETEssentialObjectType"};

[anXMLElement addChild:[NSXMLElement elementWithName:@"objectType" stringValue:etobjectTypeAsstring[objectType]]];

……但这并不完全理想;每次更改枚举时,我都不满意更新两个列表.但这是可以接受的.更糟糕的是读回XML,我目前正在这样做:

if ([[[anXMLElement childNamed:@"objectType"] stringValue] isEqualToString:@"ETRareObjectType"])
{
    [self initObjectType:ETRareObjectType];
}
else if ([[[anXMLElement childNamed:@"objectType"] stringValue] isEqualToString:@"ETEssentialObjectType"])
{
    [self initObjectType:ETEssentialObjectType];
}
else
{
    [self initObjectType:ETnormalObjectType];
}

呸!这让我很反感.必须有一种更清晰的方式来阅读,至少,或者可能是一种统一的读写方式?

我正在使用Obj-C和Cocoa,但我不介意一些纯C函数.我甚至会使用预处理器的东西,如果这是唯一的方法.

解决方法

我没有找到比复制字符串中的枚举更好的方法.但是,我的做法略有不同,即:

typedef enum {
    kManipulateWindowTargetFrontwindow,kManipulateWindowTargetNamedWindow,kManipulateWindowTargetwindowNameContaining,kManipulateWindowTargetDEFAULT = kManipulateWindowTargetFrontwindow,} ManipulateWindowtargettype;
#define kManipulateWindowtargettypeNamesArray @"Frontwindow",@"NamedWindow",@"WindowNameContaining",nil

然后在实施中:

static NSArray* kManipulateWindowtargettypeArray = [[NSArray alloc] initWithObjects: kManipulateWindowtargettypeNamesArray];

Nsstring* ManipulateWindowtargettypeToString( ManipulateWindowtargettype mwtt )
{
    return [kManipulateWindowtargettypeArray objectAtIndex:mwtt];
}

ManipulateWindowtargettype ManipulateWindowtargettypeFromString( Nsstring* s )
{
    NSUInteger n = [kManipulateWindowtargettypeArray indexOfObject:s];
    check( n != NSNotFound );
    if ( n == NSNotFound ) {
        n = kManipulateWindowTargetDEFAULT;
    }
    return (ManipulateWindowtargettype) n;
}

我使用#define的原因是为了避免在头文件中声明数组,但是将枚举的定义与字符串序列的定义分开是疯狂的,所以这是我发现的最好的折衷方案.

由于代码是样板文件,因此您实际上可以在NSArray上将它们作为类别.

@interface NSArray (XMLExtensions)

- (Nsstring*) stringWithEnum: (NSUInteger) e;
- (NSUInteger) enumFromString: (Nsstring*) s default: (NSUInteger) def;
- (NSUInteger) enumFromString: (Nsstring*) s;

@end

@implementation NSArray (XMLExtensions)

- (Nsstring*) stringWithEnum: (NSUInteger) e;
{
    return [self objectAtIndex:e];
}

- (NSUInteger) enumFromString: (Nsstring*) s default: (NSUInteger) def;
{
    NSUInteger n = [self indexOfObject:s];
    check( n != NSNotFound );
    if ( n == NSNotFound ) {
        n = def;
    }
    return n;
}

- (NSUInteger) enumFromString: (Nsstring*) s;
{
    return [self enumFromString:s default:0];
}


@end

然后:

NSLog( @"s is %@",[kManipulateWindowtargettypeArray stringWithEnum:kManipulateWindowTargetNamedWindow] );
ManipulateWindowtargettype mwtt = (ManipulateWindowtargettype)[kManipulateWindowtargettypeArray enumFromString:@"WindowNameContaining" default:kManipulateWindowTargetDEFAULT];
NSLog( @"e is %d",mwtt );

相关文章

我正在用TitaniumDeveloper编写一个应用程序,它允许我使用Ja...
我的问题是当我尝试从UIWebView中调用我的AngularJS应用程序...
我想获取在我的Mac上运行的所有前台应用程序的应用程序图标....
我是一名PHP开发人员,我使用MVC模式和面向对象的代码.我真的...
OSX中的SetTimer在Windows中是否有任何等效功能?我正在使用...
我不确定引擎盖下到底发生了什么,但这是我的设置,示例代码和...