2011-01-25 12 views
12

मैं एनएसएमयूटेबल डिक्शनरी के उप-वर्ग को कार्यान्वित करने की कोशिश कर रहा हूं जो एनएसयूंडिफाइंड की अपवाद को फेंकने के बजाए शून्य देता है जब कुंजी शब्दकोश में मौजूद नहीं होती है।सबक्लासिंग एनएसएमयूटेबल डिक्शनरी

हालांकि जब मैं अपने शब्दकोश में वस्तुओं को जोड़ने का प्रयास मैं

[NSMutableDictionary setObject:forKey:]: method only defined for abstract class 

NilDictionary.h

@interface NilDictionary : NSMutableDictionary { 
} 
@end 

NilDctionary.m

@implementation NilDictionary 
- (id)valueForUndefinedKey:(NSString *)key { 
    return nil; 
} 
@end 

मैं वास्तव में सभी को लागू करने की है मिल मेरे सबक्लास में फिर से एनएसएमयूटेबल डिक्शनरी के तरीकों या क्या कोई अन्य वर्ग है जो मुझे सबक्लास होना चाहिए गाओ?

स्पष्टीकरण: मेरी मूल समस्या मेरे पास नीचे आ गई है कि वह दस्तावेज़ को सही तरीके से पढ़ने में सक्षम न हो।

यदि आपको एनएसएमयूटेबल डिक्शनरी को उप-वर्गीकरण करने की आवश्यकता है तो सही उत्तर देखें। यदि आप एक शब्दकोश चाहते हैं जो आपकी कुंजी मौजूद नहीं होने पर शून्य लौटाता है, तो एनएसएमयूटेबल डिक्शनरी पहले से ही करता है।

+1

एक एनएसयूंडिफाइडकेएक्स अपवाद 'को फेंकने के कारण आप एक शब्दकोश के साथ क्या कर रहे हैं? किसी शब्दकोश में अमान्य कुंजी तक पहुंचने का प्रयास करने से स्वचालित रूप से 'शून्य' वापस आ जाता है; आपको यह त्रुटि कैसे मिल रही है? –

उत्तर

25

NSMutableDictionary Class Reference का कहना है:

1. setObject: forKey:
2. removeObjectForKey:

आप चाहिए

एक उपवर्ग में, आप अपने आदिम तरीकों में से दोनों को ओवरराइड चाहिए NSDictionary कक्षा के आदिम तरीकों को भी ओवरराइड करें।


NSDictionary Class Reference का कहना है:

आप NSDictionary उपवर्ग की जरूरत है, तो आप खाते है कि एक Class cluster का प्रतिनिधित्व करती है में रखना, वहाँ इसलिए कई आदिम तरीकों जिस पर तरीकों धारणात्मक आधार पर कर रहे हैं की जरूरत है:

1. गिनती
2. objectForKey:
3. keyEnumerator
4. initWithObjects: forKeys: गिनती:

एक उपवर्ग में, आप इन सभी तरीकों को ओवरराइड करना होगा।

NSDictionary’s अन्य विधियां इन प्राइमेटिव्स में से एक या अधिक का आह्वान करके संचालित होती हैं। गैर-आदिम विधियां एक साथ कई प्रविष्टियों तक पहुंचने के सुविधाजनक तरीके प्रदान करती हैं।


ऐसा लगता है कि आप ओवरराइड इन सभी छह तरीकों करने की जरूरत है अपने NSMutableDictionary उपवर्ग काम सही बनाने के लिए।

+0

आपको 'initWithObjects को ओवरराइड करना होगा: के लिए: गिनती:' –

4

यहां आपकी समस्या है। NSDictionary (और इसके परिवर्तनीय समकक्ष) वर्ग क्लस्टर का हिस्सा हैं ('क्लास क्लस्टर' शीर्षक के तहत here के बारे में अधिक पढ़ें), और उप-वर्गीकृत नहीं किया जाना चाहिए क्योंकि इससे आपके द्वारा उल्लेखित समस्याओं का कारण बनता है (सबक्लासिंग नोट्स पढ़ें NSDictionary Class Reference में)। जो कुछ भी आपको करने की ज़रूरत है, उसके लिए आप जो कक्षाएं करना चाहते हैं, उन्हें बढ़ाने के लिए आप जिस वर्ग का उपयोग करना चाहते हैं, उसका विस्तार करने का एक तरीका होगा। उदाहरण के लिए, उपरोक्त कोड को आसानी से एक श्रेणी में रखा जा सकता है (श्रेणियों here के बारे में और पढ़ें)।

+0

सिर के लिए धन्यवाद। ऐसा लगता है कि क्लास क्लस्टर को उप-वर्ग करने के लिए मुझे बस सभी आदिम तरीकों को लागू करने की आवश्यकता है। NSMutableDictionary के लिए इसका मतलब है कि मैं भी के लिए एक सरल कार्यान्वयन लिखने की ज़रूरत * गिनती * objectForKey: * keyEnumerator * setObject: forKey: * removeObjectForKey: मैं एक वर्ग का उपयोग करने के क्योंकि जैसा कि मैंने यह समझ में संकोच कर रहा हूँ कि होगा मेरे आवेदन के भीतर एनएसएमयूटेबल डिक्शनरी के हर उपयोग को प्रभावित करते हैं? – Ben

+0

इसके अलावा, मुझे नहीं पता कि आप क्या गलत कर रहे हैं, लेकिन जब आप किसी कुंजीपटल में नहीं मिली किसी कुंजी तक पहुंचने का प्रयास करते हैं, तो यह वैसे भी 'शून्य' देता है; यह 'NSUndefinedKeyException' नहीं फेंकता है ... आप वास्तव में क्या करने की कोशिश कर रहे हैं? –

+0

धन्यवाद। मुझे शायद दस्तावेज में इसकी तलाश करने की बजाय इसे आजमाया जाना चाहिए था। – Ben

-1

क्या आप वाकई कुंजी के लिए "शून्य" में गुजरते समय अपवाद नहीं प्राप्त कर रहे हैं (मूल्य नहीं)?

संबंधित मुद्दे