gpt4 book ai didi

在 C 枚举和 XML 之间转换

转载 作者:数据小太阳 更新时间:2023-10-29 01:59:37 26 4
gpt4 key购买 nike

在 XML 中存储枚举并再次读回它的最干净的方法是什么?假设我有:

enum ETObjectType {ETNormalObjectType, ETRareObjectType, ETEssentialObjectType};

...我想取一个变量,enum 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 );

关于在 C 枚举和 XML 之间转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1242914/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com