Dalsze rozszerzenie na sugestię od Graham Lee ...
Można użyć objective-c category aby dodać metodę NSMutableDictionary, który pozwala na dodanie wartości z klucza swojego typu non NSObject . Dzięki temu twój kod nie będzie zawierał składanki do pakowania/rozpakowywania.
Ponownie zakładając
enum ETest { FOO, BAR };
Najpierw dodajemy konstruktora przekonać do 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
Następny dodamy wsparcie '' ENUM Etest do 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
Oryginalny przykład można przetransformować na
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
[dict setObject: @"Bar!" forETest:BAR];
NSLog(@"getting value Bar -> %@", [dict objectForETest: BAR]);
[dict release];
W zależności od tego, ile uzyskujemy, aby uzyskać dostęp do słownika, może to znacznie poprawić czytelność kodu.
Dzięki! To działało absolutnie świetnie :) – PlagueHammer