2011-02-02 10 views
20

मेरे पास एक कक्षा है और मैं चाहता हूं कि मेरी कक्षा एनएसएफएस्टएनीमेशन प्रोटोकॉल की पुष्टि करे। मैंने प्रलेखन पढ़ा है लेकिन यह वास्तव में स्पष्ट नहीं है। क्या कोई मुझे बता सकता है कि प्रोटोकॉल विधि को वापस क्यों करना चाहिए और यह कैसे काम करता है? अग्रिम में धन्यवाद।क्या कोई जानता है कि NSFastEnumeration प्रोटोकॉल को कैसे कार्यान्वित किया जाए?

+0

[एनएसएफएस्टएन्यूमरेशन क्लास के उचित निर्माण] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/3468349/proper-construction-of-nsfastenumeration-class) – outis

उत्तर

41

ऐप्पल का FastEnumerationSample आपको दिखाता है कि क्या करना है, लेकिन यहां एक ब्रेकडाउन है।

एकमात्र NSFastEnumeration विधि, countByEnumeratingWithState:objects:count:, संग्रह के भाग देता है। इसे तब भी निष्पादित किया जाता है जब भी अधिक वस्तुओं की आवश्यकता होती है, जब तक यह इंगित न करे कि 0 लौटने से कोई और आइटम नहीं है। एक खंड id एस के सी सरणी के रूप में पारित किया जाता है।

विधि के भीतर, state पैरामीटर आपके द्वारा उपयोग किए जा रहे डेटा के अधिकांश (यदि नहीं सभी) रखता है। आपको state->itemsPtr सेट करना होगा और के प्रत्येक अलग-अलग आमंत्रण के साथ state->state अपडेट करना होगा।

  • state:: यहाँ NSFastEnumerationState के प्रत्येक क्षेत्र का एक संक्षिप्त विवरण है से अधिक दोहराया जा रहा है क्रम में स्थिति का प्रतिनिधित्व करता है। अनुक्रमित संग्रह के लिए, यह सूचकांक होगा। लिंक्ड सूचियों के लिए, यह एक नोड सूचक हो सकता है। अन्य प्रकार के लिए, यह एक और जटिल प्रकार हो सकता है (उदाहरण के लिए एक पेड़ के लिए, state->state नोड्स स्टोर करने के लिए एक स्टैक के रूप में उपयोग किए जाने वाले एनएसएमयूटेबलएरे को हो सकता है)। जब countByEnumeratingWithState:objects:count: पहले कहा जाता है, state->state 0 है; state संरचना आरंभ करने के लिए इस स्थिति की जांच करें।
  • itemsPtr: खंड में आइटम; id एस की सी सरणी को इंगित करता है। कोको इस सरणी पर लूप करेगा, प्रत्येक आइटम को फॉर-इन लूप में नामित चर के बदले में बाध्य करेगा।
  • mutationsPtr: उत्परिवर्तनीय संग्रह के लिए, यह इंगित करने के लिए उपयोग किया जाता है कि अंतिम कॉल के बाद संग्रह countByEnumeratingWithState:objects:count: पर बदल गया है। आम तौर पर, आप राज्य को प्रारंभ करते समय इसे एक बार सेट करेंगे। कलेक्शन म्यूटेटर उस मान को बढ़ाते हैं जो यह इंगित करता है। कोको पिछले आवेदक के मूल्य पर countByEnumeratingWithState:objects:count: द्वारा लौटाए गए मान की तुलना करेगा; यदि वे अलग हैं, कोको एक अपवाद फेंक देगा।
  • extra: आप अतिरिक्त डेटा स्टोर करने के लिए इसका उपयोग कर सकते हैं।

आप state->state और state->extra के किसी भी तत्व को जो भी चाहें सेट कर सकते हैं; वे पूरी तरह से आपकी सुविधा के लिए प्रदान किए जाते हैं, और कोको को प्रभावित नहीं करते हैं। state->itemsPtr, *state->mutationsPtr और विधि द्वारा लौटाए गए मान, हालांकि, कोको को प्रभावित करते हैं।

दो अन्य विधि पैरामीटर के लिए, stackbuf एक सरणी है जो कोको वस्तुओं को पकड़ने के लिए प्रदान करती है। इसका उपयोग वैकल्पिक है, लेकिन यदि आप इसका उपयोग नहीं करते हैं, तो आपको state->itemPtr के लिए संग्रहण स्थान आवंटित करना होगा। यदि आप इसका उपयोग करते हैं, तो प्रत्येक आमंत्रण के साथ state->itemsPtrstackbuf पर सेट करें। lenstackbuf की लंबाई है, जो आइटम आप उसमें स्टोर करने में सक्षम होंगे की अधिकतम संख्या।

अतिरिक्त पठन:

+0

डाउन-मतदाता देखभाल को समझाएगा कि नमूना कोड का संदर्भ क्यों दिया जाता है एक दस्तावेज कार्यान्वयन एक डाउन वोट के योग्य है? ओपी ने नमूना पढ़ने का कभी भी उल्लेख नहीं किया। नमूना कोड के लेखक ने सामान्य SO उत्तर की तुलना में उदाहरण में अधिक समय लगाया। taaaaanks – justin

+0

दो गलत कोई अधिकार नहीं बनाते हैं ... (यानी एक बुरा सवाल ... एक बुरे सवाल के लिए)। मैं आपको ऊपर या नीचे मतदान नहीं कर रहा हूं, क्योंकि इस प्रकार का जवाब कष्टप्रद रूप से व्यापक है .. आईएमओ, यह माना जाना चाहिए कि ओपी ने आधिकारिक दस्तावेज़ीकरण हमेशा पढ़ा है, और या तो कुछ "परे" है जो " आधिकारिक दस्तावेज़ "- जिसे यहां विस्तृत किया जा सकता है ... या प्रश्न को वोट दिया जाना चाहिए। बस मेरा $ .02। –

+0

@alex को लगता है कि ओपी ने दस्तावेज़ों को पढ़ा था - ओपी में कहा गया है। ओपी ने नमूना कोड देखा है जो इस विषय को काफी समझाता है और विवरण देता है। मेरे जवाब में terseness उचित लग रहा था क्योंकि नमूना पहले से ही बताता है कि मुझे आसवन और दोहराना होगा। बेशक, इन टिप्पणी क्षेत्रों और नए प्रश्न पूछे जा सकते हैं यदि आगे स्पष्टीकरण की आवश्यकता है। उत्तर को हल करने के रूप में चिह्नित किया गया था, और अपवॉट्स की संख्या, आप सामान्य मामले के लिए सही दिशा में एक अच्छा पर्याप्त धक्का जवाब दे सकते हैं। (cont) – justin

3

बस एक उत्कृष्ट स्पष्टीकरण पाने के बाद इस सूत्र को पुनर्जीवित। ऐप्पल लिंक टूटा हुआ प्रतीत होता है। आप यहां कोशिश कर सकते हैं: https://developer.apple.com/library/ios/#samplecode/FastEnumerationSample/Introduction/Intro.html

मुझे मिली तीव्रता को लागू करने के लिए सबसे अच्छा उदाहरण है: http://mikeash.com/pyblog/friday-qa-2010-04-16-implementing-fast-enumeration.html। यह इससे भी बदतर दिखता है।