मैं NSDictionary
से अधिकतर उत्तरों से सहमत हूं objectForKey:
या इसी तरह के तरीकों से पहुंचा जाना चाहिए। हालांकि 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);
यह प्रिंट होगा: NSDictionary
पहुँचने के लिए एक मुखौटा के रूप में
someData content
someOtherData content
तो मूल रूप से DictionaryProperties
काम करता है। शब्दकोष पर कॉल करें get-property
विधि कॉल को getObjectForKey:
में कनवर्ट करने के लिए forwardInvocation
का उपयोग करता है। मुझे इसके बारे में क्या पसंद है, यह है कि यह शब्दकोश पर स्वत: पूर्णता की अनुमति देता है, और मुझे यह स्पष्ट रूप से घोषित करने की अनुमति देता है कि मैं किस कुंजी को एक्सेस करना चाहता हूं (ExampleDictContent.h
फ़ाइल में)। ध्यान दें कि यह समाधान गुणों के लिए लेखन पहुंच की अनुमति नहीं देता है, लेकिन इसे नीचे दिए गए लिंक में दिखाए गए अनुसार जोड़ा जा सकता है।
यह समाधान आंशिक रूप से karstenlitsche's solution से प्रेरित किया गया है। मुख्य अंतर यह है कि यह समाधान श्रेणियों के बजाय उप-वर्गीकरण पर आधारित है।
मुझे कुछ मिनट दें, मैं कुछ ऐसा कर दूंगा जो आपको श्रेणी का उपयोग करके डॉट नोटेशन का उपयोग करने देगा। –
@ रिचर्ड जे। रॉसीआईआई मुझे नहीं लगता कि आपको एक श्रेणी के साथ जवाब देना चाहिए। यह कुछ ओबीजे-सी क्षमताओं को दिखाता है, लेकिन इसके लिए यह बहुत बुरा अभ्यास होगा। शायद एक मॉडल ऑब्जेक्ट का सुझाव देना जो 'NSObject' का उप-वर्ग है, एक बेहतर दृष्टिकोण होगा। –
मुझे संदेह है कि आप ओवरराइटिंग के साथ कुछ कर सकते हैं '- (आईडी) मानफॉरंडिफाइडकी:' चूंकि कंपाइलर डॉट को अस्वीकार कर देगा ... – JustSid