2010-06-14 13 views
18

मेरे पास एनएसएमयूटेबलएरे * बच्चों को डेटास्ट्रक्चर-क्लास "फू" में है जो "बार 1" और "बार 2" जैसे कई अन्य लोगों का सुपरक्लास है। वह सरणी बारू और बार 2 ऑब्जेक्ट्स को फू से उप-वर्गों की एक वृक्ष जैसी रिकर्सिव पेरेंट-बच्चों-संरचना प्राप्त करने के लिए स्टोर करती है। उन के माध्यम से सरणी में वस्तुओं का उपयोग करने के लिए, मैं पाश ऑब्जेक्टिव-सी में foreach पाश का उपयोग कर:उद्देश्य-सी एनएसएमयूटेबलएरे - एकाधिक कक्षाओं की वस्तुओं के साथ foreach पाश

for(Foo *aFoo in children) { 
    ... 
} 

लेकिन अक्सर मैं सिर्फ पाश करने के लिए सरणी में वस्तुओं एक निश्चित वर्ग है के माध्यम से, इस में की जरूरत है अगर मैं सरणी बच्चों में कक्षा बार 1 के प्रत्येक ऑब्जेक्ट के लिए एक कार्य करना चाहता हूं। (बच्चों में बार 1 * anObject) के लिए उपयोग करना फिर से सभी वस्तुओं के माध्यम से loops और न केवल कक्षा बार 1 के साथ। क्या मुझे हासिल करने का कोई तरीका है?

उत्तर

40

आपको सभी ऑब्जेक्ट्स पर लूप करना होगा और लूप के अंदर एक प्रकार की जांच करना होगा।

for(id aFoo in children) { 
    if ([aFoo isKindOfClass:[Bar1 class]]) 
     ... 
    } 
} 
+1

यह काफी स्मृति-महंगा हो सकता है लेकिन जाहिर है कि कोई अन्य तरीका नहीं है। धन्यवाद –

+5

नहीं, यह आपकी मेमोरी पदचिह्न को नहीं बदलता है, आप केवल – unbeli

+3

मेमोरी में पहले से ही पढ़ रहे हैं, अगर आपको संग्रह में कक्षाओं के बीच अंतर करने के लिए 'isKindOfClass:' का उपयोग करने की आवश्यकता है, तो आपका डिज़ाइन पैटर्न मानक के बाहर है। यह विशेष रूप से सच है यदि आपके संग्रह में कक्षाओं के उदाहरण हैं जो पूरी तरह से आपकी रचना के हैं। – bbum

9

आप कुछ इस तरह कर सकते हैं:

NSPredicate* bar1Predicate = [NSPredicate predicateWithFormat:@"SELF.class == %@", [Bar1 class]]; 
NSArray* bar1z = [children filteredArrayUsingPredicate:bar1Predicate]; 
for(Bar1* bar in children) { 
    // do something great 
} 

यह ध्यान रखें, हालांकि, कि इस NSString, NSNumber, आदि जैसे कई मानक कोको वर्गों उस वर्ग समूहों का उपयोग के साथ काम नहीं करेंगे या विशेष कार्यान्वयन कक्षाएं (उदाहरण के लिए, कुछ भी जो कोरफॉउंडेशन प्रकार के साथ टोल-फ्री है) क्योंकि वर्ग बिल्कुल मेल नहीं खाते हैं। हालांकि, यह कक्षाओं के साथ काम करेगा जब तक कि कक्षा वास्तव में बार 1 का उदाहरण नहीं है।

जोर नोट: उपयोगकर्ता @ एलेक्स ने सुझाव दिया कि यह स्पष्ट नहीं हो सकता है कि वर्गों को ऊपर दिए गए मेरे नोट से बिल्कुल मेल खाना चाहिए, इसलिए मैं इसे पुनः प्राप्त कर रहा हूं। वर्गों को इस फ़िल्टर के लिए बिल्कुल काम करना चाहिए, इसलिए यदि आप बार 1 को उप-वर्गीकृत करते हैं या कुछ प्रॉक्सी क्लास प्रदान करते हैं, तो आपको उन कक्षाओं को शामिल करने के लिए फ़िल्टर को समायोजित करना होगा। लिखित के रूप में, केवलBar1 के उदाहरण फ़िल्टर किए गए सरणी में वापस आ जाएंगे।

+0

भी, मुझे लगता है कि यह आईफोन – unbeli

+2

@unbeli पर उपलब्ध नहीं है: यह आईफोन पर बिल्कुल उपलब्ध है, न कि ओपी ने आईफोन का बिल्कुल उल्लेख किया है। –

+0

लेकिन, यदि आपने कभी भी 'बार 1' उपclass किया है, तो यह कोड उपclass की वस्तुओं से मेल नहीं खाएगा। ओपी सबक्लास के बारे में कुछ भी नहीं कहता है, लेकिन यह ध्यान रखना महत्वपूर्ण है। – Alex

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