Tiếp tục mở rộng trên những gợi ý từ Graham Lee ...
Bạn có thể sử dụng một cách khách quan-c category để thêm một phương pháp để NSMutableDictionary cho phép bạn thêm một giá trị với một chìa khóa kiểu NSObject phi bạn . Điều này giữ cho mã của bạn không bị ràng buộc bởi cú pháp gói/unwrapping.
Một lần nữa, giả sử
enum ETest { FOO, BAR };
tiên, chúng ta đang thêm một constructor thuyết phục để 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
Tiếp theo chúng ta sẽ thêm hỗ trợ '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
Ví dụ ban đầu do đó có thể được chuyển thành
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
[dict setObject: @"Bar!" forETest:BAR];
NSLog(@"getting value Bar -> %@", [dict objectForETest: BAR]);
[dict release];
Tùy thuộc vào mức độ bạn sử dụng enum để truy cập từ điển, điều này có thể làm giảm khả năng đọc mã của bạn một chút.
Cảm ơn! Điều đó làm việc hoàn toàn tuyệt vời :) – PlagueHammer