मेरे पास कुछ ऑब्जेक्ट रचनाओं के साथ एक मॉडल क्लास है, और मुझे इसके लिए इटरेटर लिखने का सबसे अच्छा तरीका नहीं पता है। अधिक जानकारी के में समस्या को देखने के लिए, यहाँ पदानुक्रम (सेमी-छद्म कोड) है:किसी संपत्ति की संग्रह संपत्ति (सही प्रकार के कास्टिंग के साथ) के लिए अपना खुद का इटरेटर कैसे लिखें?
एक रूट वर्ग:
MYEntity : NSObject
@property int commonProperty;
@property NSArray *childs; //Childs of any kind.
कुछ ठोस उपवर्गों:
MYConcreteStuff : MYEntity
@property int number;
MYConcreteThing : MYEntity
@property NSString *string;
और के साथ एक जड़ वस्तु कंक्रीट संग्रह:
MYRoot : MYEntity
@property MYEntity *stuff; //Collect only stuff childs here.
@property MYEntity *things; //Collect only thing childs here.
अब मैं संग्रह के लिए कूल सदस्य एक्सेसर्स लिख सकता हूं (MYEn में tity), जैसे:
-(MYEntity*)entityForIndex:(int) index
{
if ([self.childs count] > index)
return [self.childs objectAtIndex:index];
return nil;
}
और रूट ऑब्जेक्ट के लिए भी अधिक शांत, अच्छी तरह से कास्ट सदस्य सदस्य एक्सेसर्स।
-(MYConcreteThing*)thingForIndex:(int) index
{
if ([self.things count] > index)
return (MYConcreteThing*)[self.things entityForIndex];
return nil;
}
लेकिन मुझे नहीं पता कि इस तरह के संग्रह के लिए कुछ ऑनलाइनर इटरेटर कैसे लिखना है। पर डेप ग्राहक कोड कुछ की तरह है:
for (MYConcreteThing *eachThing in myRoot.things)
eachThing.string = @"Success."; //Set "thingy" stuff thanks to the correct type.
मैं ब्लॉकों का उपयोग कर के बारे में सोच रही है, लेकिन वहाँ एक और अधिक स्वच्छ कटौती समाधान हो सकता है। कोई विचार/अनुभव?
यदि चीजें एक सरणी थीं, तो यह केवल केवीओ सामान के बिना (myRoot.things में चीज * चीज़) के लिए किया जा सकता है। – Geri
लेकिन चीजें एक इकाई है जिसे बच्चे कहा जाता है। Thatswhy मुझे कुछ संकेत की जरूरत है। – Geri
मैंने प्रश्न को और स्पष्ट करने के लिए संशोधित किया। या कम से कम सटीक। :) – Geri