2012-11-20 7 views
12

फाउंडेशन में, यदि मैं एक NSArray को एक सेट परिवर्तित करना चाहते हैं, मैं उपयोग कर सकते हैं:सेट से ऐरे: एनएसएससेट सभी ऑब्जेक्ट्स का उपयोग क्यों करता है, जबकि NSOrderedSet सरणी का उपयोग करता है?

  • -[NSSet allObjects]
  • -[NSOrderedSet array]

क्यों इन अलग हैं?

+5

कारण NSSet आदेश दिया नहीं है, इसलिए allObject मतलब है कि यह आदेश दिया नहीं किया जाएगा, यह यादृच्छिक है, लेकिन NSOrderedSet एक वैकल्पिक सरणी है। "आप एक विकल्प के रूप आदेश दिया सेट का उपयोग सरणियों के लिए जब तत्वों का क्रम महत्वपूर्ण और परीक्षण में प्रदर्शन है एक वस्तु सेट में निहित है कि क्या एक सरणी की सदस्यता के लिए एक consideration- परीक्षण एक सेट की सदस्यता के लिए परीक्षण की तुलना में धीमी है सकते हैं। " – Dave

+0

@ डेव मुझे विश्वास है कि यह जवाब है। ऊपर रखो। – CodaFi

+0

लेकिन इसी तरह के तर्क से आप पूछ सकते हैं कि विधि का नाम क्यों है -सेट, नहीं -ऑर्डर्डसेट या -ऑल ऑब्जेक्ट्स? –

उत्तर

14

अटकलें, लेकिन:

क्योंकि NSSet बनाया गया था जब केवल अन्य प्रमुख संग्रह प्रकार NSArray, जो था (और अब भी है, काफी हद तक) सबसे आम संग्रह प्रकार था। तो "allObjects" नामक एक विधि स्पष्ट रूप से एक एनएसएआरएआरई वापस कर देगी। मुख्य रूप से, NSArray और NSSet -

जब NSOrderedSet और अधिक हाल ही में जोड़ा गया था, यह पहले संग्रह के अस्तित्व का सामना करना पड़ा। तो एक "allObjects" विधि संदिग्ध होगा। Ergo में दो विधियां हैं, -एरे और -सेट।

और/या, -array और सेट तरीकों क्या संभावना आंतरिक रूप से उपयोग एक या समान वर्ग हैं करने के लिए प्रॉक्सी लौट आते हैं। तो एक कार्यात्मक अर्थ में वे थोड़ा अलग हैं - उन प्रॉक्सी मूल NSOrderedSet पर उत्परिवर्तन देखेंगे। - दूसरी ओर सभी ऑब्जेक्ट्स नहीं - यह वास्तव में एक स्वतंत्र सरणी बनाता है, क्योंकि इसके आंतरिक भंडारण की संभावना हैशटेबल या इसी तरह की जिसे आसानी से प्रॉक्सी नहीं किया जाता है।

+0

बहुत अच्छा अटकलें निगल जाएगा। मैं के बारे में यह। +1 सोचा नहीं था। मैं इस चुनाव करना होगा जब कोई बेहतर है वहाँ इस सवाल का जवाब। डेव टिप्पणियाँ इस एक के रूप में के रूप में अच्छा नहीं कर रहे हैं। –

+0

डेव जवाब भी एक दिखावट है। –

1

भी ... NSArray 'allObjects' द्वारा दिया समूह में मान की एक प्रति है।

लेकिन NSArray 'सरणी' द्वारा दिया सेट में वस्तुओं की एक प्रॉक्सी है।

इस प्रकार यदि आप सेट में किसी भी वस्तु के मूल्य बदलते हैं, तो सरणी में वस्तु के मूल्य बदल जाएगा। आदेशित सेट की एक प्रति नहीं बनाई जा रही है। इसलिए दो गुणों के अलग-अलग नाम हैं क्योंकि वे अलग-अलग चीजें करते हैं।

+0

मैं सहमत हूं तरह बंद है, लेकिन अपने दूसरे पैरा शायद की तरह "लेकिन NSArray 'सरणी' द्वारा दिया के एक प्रॉक्सी है कुछ पढ़ना चाहिए मूल सेट, और यदि मूल सेट बदलता है, तो प्रॉक्सीकृत सरणी इसके साथ बदल जाएगी।" –

+0

हां, मिट्टी, मैं सहमत हूं! – OmniB

4

जबकि अन्य अंतर हैं †, .allObjects एक निश्चित क्रम का संकेत नहीं देता है, और .array करता है; और यह वही है जो आप प्राप्त कर रहे हैं।


.array † अंतर्निहित NSOrderedSet का लाइव प्रॉक्सी देता है, और अगर सेट परिवर्तन का आदेश दिया अंतर्निहित प्रॉक्सी इसके साथ बदल जाएगा।

+0

धन्यवाद! इसका क्या मतलब है? अंतर्निहित NSOrderedSet की लौटाई गई सरणी क्रमबद्ध सेट से जुड़ी हुई है, इसलिए सरणी या ऑर्डर किए गए सेट में कोई बदलाव दूसरे पर दिखाई देगा एक प्रॉक्सी एक मिडलमैन की तरह है अगर मुझे गलत नहीं लगता है। इसमें क्या प्रभाव है? मैंने सरणी को पुन: व्यवस्थित करने का प्रयास किया, लेकिन ऑर्डर कम से कम क्रम में प्रतिबिंबित नहीं हुआ: पी –

+1

'.array' एक 'एनएसएआरएआरई' वापस करें, जो केवल पढ़ने योग्य है, और आपको इसे सीधे बदलने में सक्षम नहीं होना चाहिए। अगर आप उसमें 'म्यूटेबल कॉपी' बनाते हैं, तो यह एक प्रतिलिपि है, जो मूल रूप से मूल से अलग होती है। अगर आप पुन: व्यवस्थित करना चाहते हैं, तो आप इसे अंतर्निहित 'एनएसएमयूटेबलऑर्डर्डसेट' पर करना चाहिए। परिवर्तन संभवतः सरणी में दिखाई देंगे, लेकिन मैंने कभी इसका परीक्षण नहीं किया है। –

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