NSMutable शब्दकोश तक पहुँचने के लिए Objective-C में प्रत्येक लूप के लिए


268

मुझे Objective-C में उत्परिवर्ती शब्दकोश कुंजियों और मूल्यों तक पहुंचने में कुछ कठिनाई हो रही है।

मान लीजिए कि मेरे पास यह है:

NSMutableDictionary *xyz=[[NSMutableDictionary alloc] init];

मैं कुंजी और मान सेट कर सकता हूं। अब, मैं बस प्रत्येक कुंजी और मान को एक्सेस करना चाहता हूं, लेकिन मुझे सेट की गई की संख्या की जानकारी नहीं है।

PHP में यह बहुत आसान है, कुछ इस प्रकार है:

foreach ($xyz as $key => $value)

ऑब्जेक्टिव-सी में यह कैसे संभव है?

जवाबों:


662
for (NSString* key in xyz) {
    id value = xyz[key];
    // do stuff
}

यह प्रत्येक वर्ग के लिए काम करता है जो NSFastEnumeration Protocol (10.5+ और iOS पर उपलब्ध) के अनुरूप होता है, हालाँकि NSDictionaryयह उन कुछ संग्रहों में से एक है जो आपको मानों के बजाय कुंजियों की गणना करने देता है। मेरा सुझाव है कि आप सामूहिक प्रोग्रामिंग टॉपिक में तेजी से गणना के बारे में पढ़ें ।

ओह, मैं फिर भी जोड़ना चाहिए कि आप चाहिए कभी एक संग्रह है, जबकि इसके माध्यम से गणना को संशोधित।


4
मैं सोच रहा था, यह होना चाहिए: (NSString * कुंजी में [xyz allKeys)) ?? या यह वास्तव में मायने नहीं रखता है।
फ्लोयू। SimpleUITesting.com

6
@ user76859403 एक शब्दकोष में, वास्तव में, कुंजियों की गणना करता है। for (NSString* key in [xyz allKeys])वैचारिक रूप से एक ही बात है।
5

[Xyz allKeys] का प्रयोग करें यदि आपको कुंजियों की गणना करते समय शब्दकोश को म्यूट करने की आवश्यकता है। नीचे मेरा जवाब देखें।
ब्रॉडी रॉबर्टसन

क्या यह लूप हर समय एक ही क्रम है? या हमें TableView सेक्शन के लिए इसका उपयोग करने के लिए किसी अन्य तरीके की आवश्यकता है?
यमुट्लु

1
@ymutlu, कोको शब्दकोश अनियंत्रित हैं। इसका मतलब है कि जब भी आप उन्हें संशोधित करते हैं, तो वे जिस क्रम में पुनरावृत्ति करते हैं, वह बदल सकता है।
zneak

98

ब्लॉक का उपयोग करते हुए कुंजियों और मूल्यों की गणना के लिए केवल 10.6+ विकल्प को नहीं छोड़ने के लिए ...

[dict enumerateKeysAndObjectsUsingBlock:^(id key, id object, BOOL *stop) {
    NSLog(@"%@ = %@", key, object);
}];

यदि आप चाहते हैं कि क्रियाएँ समवर्ती हों:

[dict enumerateKeysAndObjectsWithOptions:NSEnumerationConcurrent
                              usingBlock:^(id key, id object, BOOL *stop) {
    NSLog(@"%@ = %@", key, object);
}];

2
शब्दकोश के माध्यम से गणना करने के 3 अलग-अलग तरीके। । । हे, यह मुझे "स्ट्रैंसैस्ट लैंग्वेज फीचर" के उत्तर की याद दिलाता है जहां वीबी में 7 अलग-अलग प्रकार के लूप हैं।
ड्रीमलैक्स

3
अच्छी तरह से ... ObjectEnumerator 1994 में, (... के बारे में) 2006 में जोड़ा गया था, और 2009 में ब्लॉक जोड़े गए थे। एन्यूमरेशन का ब्लॉक रूप प्राकृतिक नतीजा है।
bbum

ऐसा लगता है कि निर्माण के लिए मानक से अधिक तेज़ ... निर्माण: oneofthesedaysblog.com/block-vs-for-in-objective-c-enumeration
lkraider

1
@lkider, मैंने उस पोस्ट पर टिप्पणी की, जो वास्तव में लूप के लिए एक पुराने के साथ ब्लॉक-आधारित गणन की तुलना करता है, न कि निर्माण में ... के लिए।
क्विन टेलर

किसलिए है *stop? आप इसका उपयोग कैसे करते हैं? कोई संदर्भ?
बोरिसादिकुर

13

यदि आपको एनुमरेट करते समय शब्दकोश को म्यूट करने की आवश्यकता है :

for (NSString* key in xyz.allKeys) {
    [xyz setValue:[NSNumber numberWithBool:YES] forKey:key];
}

इसका कारण allKeysचाबी की एक प्रति है। तो शब्दकोश को म्यूट करना सुरक्षित है।
होंगहो झांग

5

किसी शब्दकोश की गणना करने का सबसे आसान तरीका है

for (NSString *key in tDictionary.keyEnumerator) 
{
    //do something here;
}

कहाँ tDictionaryहै NSDictionaryया NSMutableDictionaryआप इसे पुनरावृत्त करना चाहते हैं।


4

मेरा सुझाव है कि आप गणना: कोको के लिए संग्रह प्रोग्रामिंग गाइड के एक संग्रह के तत्वों का हिस्सा है । आपकी जरूरत के लिए एक नमूना कोड है।


वे अच्छे लिंक हैं, हालांकि @zneak पोस्ट किया गया कोड बहुत सरल और तेज है, अगर आप 10.5+ या iPhone के लिए निर्माण कर सकते हैं।
क्विन टेलर

2

फास्ट एन्यूमरेशन 10.5 और iPhone ओएस में जोड़ा गया था, और यह काफी तेज है, न कि सिंटैक्टिक शुगर। यदि आपको पुराने रनटाइम (यानी 10.4 और पीछे की ओर) को लक्षित करना है, तो आपको गणना करने की पुरानी पद्धति का उपयोग करना होगा:

NSDictionary *myDict = ... some keys and values ...
NSEnumerator *keyEnum = [myDict keyEnumerator];
id key;

while ((key = [keyEnum nextObject]))
{
    id value = [myDict objectForKey:key];
    ... do work with "value" ...
}

आप एन्यूमरेटर ऑब्जेक्ट को रिलीज़ नहीं करते हैं, और आप इसे रीसेट नहीं कर सकते। यदि आप शुरू करना चाहते हैं, तो आपको डिक्शनरी से एक नया एन्यूमरेटर ऑब्जेक्ट माँगना होगा।


1

आप -[NSDictionary allKeys]इसके माध्यम से सभी कुंजी और लूप तक पहुँचने के लिए उपयोग कर सकते हैं ।


2
यह सच है, लेकिन यह एक अतिरिक्त ऑटोरेल्ड सरणी बनाता है, जो काफी बेकार हो सकता है, विशेष रूप से बहुत सारी कुंजियों के साथ शब्दकोशों के लिए।
क्विन टेलर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.