Продолжая предложение Грэма Ли ...
Вы можете использовать objective-c category, чтобы добавить в NSMutableDictionary метод, который позволяет вам добавлять значение с ключом вашего типа, отличного от NSObject. Это избавляет ваш код от синтаксиса упаковки / развертывания.
Опять же, предполагая
enum ETest { FOO, BAR };
Во-первых, мы добавляем конструктор убеждения в NSValue:
@interface NSValue (valueWithETest)
+(NSValue*) valueWithETest:(enum ETest)etest;
@end
@implementation NSValue (valueWithETest)
+(NSValue*) valueWithETest:(enum ETest)etest
{
return [NSValue value: &etest withObjCType: @encode(enum ETest)];
}
@end
Затем мы добавим поддержку enum ETest в NSMutableDictionary.
@interface NSMutableDictionary (objectForETest)
-(void) setObject:(id)anObject forETest:(enum ETest)key;
-(id) objectForETest:(enum ETest)key;
@end
@implementation NSMutableDictionary (objectForETest)
-(void) setObject:(id)anObject forETest:(enum ETest)key
{
[self setObject: anObject forKey:[NSValue valueWithETest:key]];
}
-(id) objectForETest:(enum ETest)key
{
return [self objectForKey:[NSValue valueWithETest:key]];
}
@end
Таким образом, исходный пример можно преобразовать в
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
[dict setObject: @"Bar!" forETest:BAR];
NSLog(@"getting value Bar -> %@", [dict objectForETest: BAR]);
[dict release];
В зависимости от того, насколько часто вы используете перечисление для доступа к словарю, это может немного облегчить читаемость вашего кода.
person
VoidPointer
schedule
27.07.2009