在
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]; }
呸!这让我很反感.必须有一种更清晰的方式来阅读,至少,或者可能是一种统一的读写方式?
解决方法
我没有找到比复制字符串中的枚举更好的方法.但是,我的做法略有不同,即:
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 );
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。