Я не нашел лучшего способа, чем дублировать перечисление в строке. Однако я делаю это немного по-другому, а именно:
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, состоит в том, чтобы не объявлять массив в заголовочном файле, но было бы безумно отделять определение enum от определения последовательности строк, так что это лучший компромисс, который я нашел.
Поскольку этот код является стандартным, вы можете сделать его категорией в 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 );