2012-10-31 9 views
5

मैं आईओएस 6 प्रोजेक्ट में कई स्थानों पर NSMapTable का उपयोग कर रहा हूं, और ऑब्जेक्ट एक्सेस करने के लिए नई डिक्शनरी सबस्क्रिप्टिंग शैली का उपयोग करने में सक्षम होना चाहता हूं। (NSMapTablethis StackOverflow question में एक NSMutableDictionary की तरह ज्यादातर व्यवहार करती है, लेकिन चाबी के लिए विभिन्न स्मृति प्रबंधन विकल्पों के साथ विन्यस्त किया जा सकता है और यह महत्व देता भंडार अधिक पृष्ठभूमि।।)आईओएस 6 में एनएसएमएपटेबल के लिए सब्सक्रिप्शन सिंटैक्स 6

संकलक रिपोर्ट इस जब प्रयास करते हुए एक NSMapTable उदाहरण पर वाक्य रचना subscripting उपयोग करने के लिए:

टाइपिंग तत्व को पढ़ने के लिए अपेक्षित विधि 'NSMapTable *' प्रकार की वस्तु पर नहीं मिली।

मैं एक वर्ग का उपयोग कैसे विस्तार करने के लिए NSMapTable नई NSDictionary शैली subscripting अनुमति देने के लिए कर सकते हैं?

उत्तर

4

जवाब वास्तव में आसान है; सब्सक्रिप्शन कैसे कार्यान्वित किया जाता है, इस बारे में अधिक जानकारी के लिए this question देखें। इस तरह की एक श्रेणी जोड़ें।

हैडर:

@interface NSMapTable (Subscripting) 

- (void)setObject:(id)obj forKeyedSubscript:(id <NSCopying>)key; 
- (id)objectForKeyedSubscript:(id)key; 

@end 

कार्यान्वयन:

@implementation NSMapTable (Subscripting) 

- (void)setObject:(id)obj forKeyedSubscript:(id <NSCopying>)key { 
    [self setObject:obj forKey:key]; 
} 

- (id)objectForKeyedSubscript:(id)key { 
    return [self objectForKey:key]; 
} 

@end 

यह मैं आश्चर्य, एक पल के लिए, चाहे सबस्क्रिप्ट पहुँच वास्तव में एक छोटा सा कुछ या सभी मामलों में विकल्प की तुलना में धीमी है, लेकिन शब्द "समयपूर्व अनुकूलन" उस विचार को अपरिहार्य मानते हैं।

+1

IMO, यह एक अच्छा विचार नहीं है। 'NSMapTable' के कारण किसी कारण के लिए सदस्यता नहीं है। उदाहरण के लिए, यदि आप एक 'NSMapTable' मिल गया है यदि का उपयोग करते हुए' NSPointerFunctionsStrongMemory', तुम क्यों 'NSCopying' के अनुरूप होना अनिवार्य होगा? यह श्रेणी वास्तव में एक शब्दकोश-जैसे संग्रह में 'NSMapTable' को अपंग करती है। –

+0

@RudolfAdamkovic आप सदस्यता तरीकों घोषणाओं में 'NSCopying' के उपयोग से बच सकते हैं। – k06a

2

NSDictionary के nil कुंजी के लिए वस्तु की स्थापना पर व्यवहार के साथ बेहतर @mjh जवाब और कहा Obj सी जेनेरिक्स:

@interface NSMapTable<KeyType, ObjectType> (Subscripting) 

- (void)setObject:(ObjectType)obj forKeyedSubscript:(KeyType)key; 
- (ObjectType)objectForKeyedSubscript:(KeyType)key; 

@end 

@implementation NSMapTable (Subscripting) 

- (void)setObject:(id)obj forKeyedSubscript:(id)key { 
    if (object) { 
     [self setObject:obj forKey:key]; 
    } else { 
     [self removeObjectForKey:key]; 
    } 
} 

- (id)objectForKeyedSubscript:(id)key { 
    return [self objectForKey:key]; 
} 

@end