2011-01-28 10 views
6

पर NSFastEnumeration कार्यान्वित करना मेरे पास एक कक्षा है जो NSObject से प्राप्त होती है। यह बच्चों की वस्तुओं को पकड़ने के लिए एनएसएमयूटेबलएरे का उपयोग करता है, उदाहरण के लिए व्यक्ति वस्तुओं को पकड़ने के लिए एनएसएमयूटेबलएरे * आइटम का उपयोग करने वाले लोग। मैं वस्तुओं पर NSFastEnumerator कैसे कार्यान्वित करूं?कस्टम कक्षा

मैं कोशिश की है, लेकिन यह निम्न अमान्य है:

@interface People : NSObject <NSFastEnumeration> 
{ 
    NSMutableArray *items; 
} 

@implementation ...

- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(id *)stackbuf count:(NSUInteger)len 
{ 
    if(state->state == 0) 
    { 
     state->mutationsPtr = (unsigned long *)self; 
     state->itemsPtr = items; 
     state->state = [items count]; 
     return count; 
    } 
    else 
     return 0; 
} 
+0

यह क्या है कि आप क्या करने की कोशिश कर रहे हैं? यदि आप केवल [सरणी गिनती] का उपयोग करते हैं तो आप पहले से ही गिनती प्राप्त कर सकते हैं, यदि आप उस सरणी में कुछ प्रकार की ऑब्जेक्ट्स की गिनती प्राप्त करना चाहते हैं जिसका उपयोग आपको (सरणी में आईडी ऑब्जेक्ट) के लिए करना चाहिए <= जो तेज गणना –

+0

है मेरे ऐप प्रतिनिधि में मेरे पीपुल्स क्लास पर उदाहरण दें मान लें कि मैं ऐसा करने में सक्षम होना चाहता हूं: (व्यक्तियों में पी * व्यक्ति) { एनएसएलओजी (पी); } – user593733

उत्तर

18

आप NSFastEnumerationState संरचना का सही उपयोग नहीं कर रहे हैं। NSFastEnumeration Protocol Reference देखें और प्रत्येक फ़ील्ड का विवरण देखने के लिए स्थिरांक अनुभाग देखें। आपके मामले में, आपको state->mutationsPtr को शून्य के रूप में छोड़ना चाहिए। state->itemsPtr वस्तुओं की सी-सरणी पर सेट किया जाना चाहिए, न कि एनएसएआरएआरई या एनएसएमयूटेबलएरे। आपको स्टैकबफ के रूप में पारित सरणी में एक ही ऑब्जेक्ट्स को रखने की आवश्यकता है।

हालांकि

, जब से तुम एक NSMutableArray का उपयोग कर रहे वस्तुओं आप की गणना कर रहे हैं शामिल करने के लिए, तो आप उस वस्तु को कॉल अग्रेषित कर सकते हैं:

- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(id *)stackbuf count:(NSUInteger)len { 
    return [items countByEnumeratingWithState:state objects:stackbuf count:len]; 
} 
+2

'बस उस ऑब्जेक्ट पर कॉल अग्रेषित करें' अब मैं इसके बारे में क्यों नहीं सोचा था। धन्यवाद! – user593733

+0

क्या मूल्य * mutationsPtr कॉलर द्वारा कैश किया जाएगा? \t राज्य के लिए सुरक्षित होगा-> mutationsPtr = और राज्य-> अतिरिक्त [0]; अगर यह न्यूल को अनदेखा नहीं कर रहा है। –

1

एक NSFastEnumeration प्रोटोकॉल नहीं है, लेकिन आप (न के बराबर) NSFastEnumerator प्रोटोकॉल का उपयोग कर रहे हैं । क्या यह समस्या हो सकती है?

+0

मेरे ऐप प्रतिनिधि में मेरे पीपुल्स क्लास पर मेरा एक उदाहरण है मान लें कि मैं ऐसा करने में सक्षम होना चाहता हूं: (व्यक्तियों में पी * व्यक्ति) { एनएसएलओजी (पी); } – user593733

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