मेरे पास एक कक्षा है और मैं चाहता हूं कि मेरी कक्षा एनएसएफएस्टएनीमेशन प्रोटोकॉल की पुष्टि करे। मैंने प्रलेखन पढ़ा है लेकिन यह वास्तव में स्पष्ट नहीं है। क्या कोई मुझे बता सकता है कि प्रोटोकॉल विधि को वापस क्यों करना चाहिए और यह कैसे काम करता है? अग्रिम में धन्यवाद।क्या कोई जानता है कि NSFastEnumeration प्रोटोकॉल को कैसे कार्यान्वित किया जाए?
उत्तर
ऐप्पल का 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->itemsPtr
stackbuf
पर सेट करें। len
stackbuf
की लंबाई है, जो आइटम आप उसमें स्टोर करने में सक्षम होंगे की अधिकतम संख्या।
अतिरिक्त पठन:
डाउन-मतदाता देखभाल को समझाएगा कि नमूना कोड का संदर्भ क्यों दिया जाता है एक दस्तावेज कार्यान्वयन एक डाउन वोट के योग्य है? ओपी ने नमूना पढ़ने का कभी भी उल्लेख नहीं किया। नमूना कोड के लेखक ने सामान्य SO उत्तर की तुलना में उदाहरण में अधिक समय लगाया। taaaaanks – justin
दो गलत कोई अधिकार नहीं बनाते हैं ... (यानी एक बुरा सवाल ... एक बुरे सवाल के लिए)। मैं आपको ऊपर या नीचे मतदान नहीं कर रहा हूं, क्योंकि इस प्रकार का जवाब कष्टप्रद रूप से व्यापक है .. आईएमओ, यह माना जाना चाहिए कि ओपी ने आधिकारिक दस्तावेज़ीकरण हमेशा पढ़ा है, और या तो कुछ "परे" है जो " आधिकारिक दस्तावेज़ "- जिसे यहां विस्तृत किया जा सकता है ... या प्रश्न को वोट दिया जाना चाहिए। बस मेरा $ .02। –
@alex को लगता है कि ओपी ने दस्तावेज़ों को पढ़ा था - ओपी में कहा गया है। ओपी ने नमूना कोड देखा है जो इस विषय को काफी समझाता है और विवरण देता है। मेरे जवाब में terseness उचित लग रहा था क्योंकि नमूना पहले से ही बताता है कि मुझे आसवन और दोहराना होगा। बेशक, इन टिप्पणी क्षेत्रों और नए प्रश्न पूछे जा सकते हैं यदि आगे स्पष्टीकरण की आवश्यकता है। उत्तर को हल करने के रूप में चिह्नित किया गया था, और अपवॉट्स की संख्या, आप सामान्य मामले के लिए सही दिशा में एक अच्छा पर्याप्त धक्का जवाब दे सकते हैं। (cont) – justin
बस एक उत्कृष्ट स्पष्टीकरण पाने के बाद इस सूत्र को पुनर्जीवित। ऐप्पल लिंक टूटा हुआ प्रतीत होता है। आप यहां कोशिश कर सकते हैं: https://developer.apple.com/library/ios/#samplecode/FastEnumerationSample/Introduction/Intro.html
मुझे मिली तीव्रता को लागू करने के लिए सबसे अच्छा उदाहरण है: http://mikeash.com/pyblog/friday-qa-2010-04-16-implementing-fast-enumeration.html। यह इससे भी बदतर दिखता है।
[एनएसएफएस्टएन्यूमरेशन क्लास के उचित निर्माण] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/3468349/proper-construction-of-nsfastenumeration-class) – outis