我同意使用objectForKey:
或類似方法訪問NSDictionary
的大部分答案。但是,可以允許點符號訪問NSDictionary
,並且出於學習目的,這可能對某人有意思。另外,例如,當您通過AFNetworking
檢索大型JSON字典時,此方法可以簡化代碼的訪問和可讀性。
這是我的解決方案:
DictionaryProperties.h:(類包裹的NSDictionary的屬性訪問)
@interface DictionaryProperties : NSObject{
NSMutableDictionary* _backingDict;
}
@property (nonatomic, strong) NSMutableDictionary* backingDict;
+ (DictionaryProperties*) allocWithDictionary:(NSDictionary*)dict;
@end
DictionaryProperties.m:
#import "DictionaryProperties.h"
@implementation DictionaryProperties
@synthesize backingDict = _backingDict;
- (id) initWithDictionary:(NSDictionary*)dict {
if (self) {
if ([dict isKindOfClass:[NSMutableDictionary class]]) {
self.backingDict = (id)dict;
} else {
self.backingDict = [[NSMutableDictionary alloc] initWithDictionary:dict];
}
}
return self;
}
+ (DictionaryProperties*) allocWithDictionary:(NSDictionary*)dict {
return [[DictionaryProperties alloc] initWithDictionary:dict];
}
- (void)forwardInvocation:(NSInvocation *)invocation
{
NSString* key = NSStringFromSelector(invocation.selector);
invocation.selector = @selector(objectForKey:);
[invocation setArgument:&key atIndex:2];
if ([self.backingDict objectForKey:key]) {
[invocation invokeWithTarget:self.backingDict];
} else {
[self doesNotRecognizeSelector:invocation.selector];
}
}
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector{
return [self.backingDict methodSignatureForSelector:@selector(objectForKey:)];
}
@end
ExampleDictContent.h:(類宣佈字典裏面有什麼)
#import "DictionaryProperties.h"
@interface ExampleDictContent : DictionaryProperties
@property (strong, nonatomic) NSString* someData;
@property (strong, nonatomic) NSString* someOtherData;
@end
@implementation ExampleDictContent
@end
用法:(一本字典的簡單聲明,包裝和屬性訪問的分配)
#import "ExampleDictContent.h"
NSDictionary* d = [NSDictionary dictionaryWithObjects:NSArray arrayWithObjects:@"someData content", @"someOtherData content", nil
forKeys:NSArray arrayWithObjects:@"someData", @"someOtherData", nil];
ExampleDictContent* dictWProps = [ExampleDictContent allocWithDictionary:d];
NSLog(dictWProps.someData);
NSLog(dictWProps.someData);
這將打印:
someData content
someOtherData content
所以基本上DictionaryProperties
作品用於訪問NSDictionary
一個門面。它使用forwardInvocation
將get-property
方法調用轉換爲字典上的getObjectForKey:
調用。我喜歡它的是,它允許在字典上自動完成,並允許我明確聲明我想訪問的密鑰(在ExampleDictContent.h
文件中)。請注意,此解決方案不允許對這些屬性進行寫入訪問,但可以按照以下鏈接所示添加該解決方案。
該解決方案部分受到karstenlitsche's solution的啓發。主要區別在於此解決方案基於子類而不是類別。
給我幾分鐘,我會做一些讓你使用點符號使用類別。 – 2012-02-13 16:59:50
@ RichardJ.RossIII我不認爲你應該回答一個類別。它展示了一些Obj-C的功能,但這對於這一點來說是非常糟糕的做法。也許建議一個模型對象是'NSObject'的一個子類將是一個更好的方法。 – 2012-02-13 17:03:08
我懷疑你可以做一些覆蓋' - (id)valueForUndefinedKey:'因爲編譯器會拒絕點... – JustSid 2012-02-13 17:04:51