एक NSMutableDictionary के माध्यम से पाशन


जवाबों:


211

एक मानक तरीका इस तरह दिखेगा

for(id key in myDict) {
    id value = [myDict objectForKey:key];
    [value doStuff];
}

अगर केवल कुछ करने का एक तरीका था जैसे: for (id key, value in myDict)वह एकदम सही होगा।
लुइस अर्तोला जूल

4
id key in myDict.allKeysशब्दकोश के बजाय (यानी ) कुंजी के माध्यम से पुनरावृति करने के लिए बेहतर है । यह आपको शब्दकोश को म्यूट करने की अनुमति देता है, जो कि आप क्या करना चाहते हैं।
मार्सेल सलाथे

29

आप उपयोग कर सकते हैं

[myDict enumerateKeysAndObjectsUsingBlock: ^(id key, id obj, BOOL *stop) {
    // do something with key and obj
}];

यदि आपका लक्ष्य OS ब्लॉक का समर्थन करता है।


22

आप अपने मूल्यों [dict allValues]को प्राप्त करने के लिए उपयोग कर सकते हैं NSArray। ध्यान रखें कि यह कॉल के बीच किसी भी आदेश की गारंटी नहीं देता है।


3
मैं इस पर एक (शब्दकोश में आईडी कुंजी) का उपयोग करेगा, विशेष रूप से एक उत्परिवर्तनीय शब्दकोश पर, क्योंकि बाद में एक त्रुटि हो जाती है अगर शब्दकोश को संशोधित किया जा रहा है।
सिगसेव

"यह गारंटी नहीं देता है" - इसकी अक्सर आवश्यकता होती है (अधिकांश भाषाओं में शब्दकोश का एक संस्करण है जो डीईईएस गारंटी आदेश करता है) - क्या यह अभ्यास आदेश को संरक्षित करता है ?
एडम

@ मैडम एक्स पर, मेरे पास बहुत मिश्रित ऑर्डर था (प्रविष्टि का क्रम नहीं, अल्फ़ाबेटिक नहीं, कुछ भी नहीं), लेकिन कॉल के अनुरूप।
jv42

यदि मैपिंग में कोई फर्क नहीं पड़ता है तो एनएसएडर का उपयोग क्यों करें?
स्टीफन

2
@stephen आमतौर पर यह कहीं न कहीं मायने रखता है और कहीं और नहीं। आपको अद्वितीय कुंजी बाधा भी मिलती है जो कुछ मामलों के लिए उपयोगी हो सकती है।
jv42

4
  1. सरल लूप के लिए, ब्लॉक-आधारित लूप की तुलना में तेजी से गणना थोड़ी तेज है
  2. ब्लॉक-आधारित एन्यूमरेशन के साथ समवर्ती या रिवर्स एन्यूमरेशन को करना आसान है, फास्ट एन्यूमरेशन की तुलना में जब एनएसबॉडी के साथ लूपिंग किया जाता है, तो आप ब्लॉक-आधारित एन्यूमरेटर के साथ एक हिट में कुंजी और मान प्राप्त कर सकते हैं, जबकि फास्ट एन्यूमरेशन के साथ आपको पुनर्प्राप्त करने के लिए कुंजी का उपयोग करना होगा। एक अलग संदेश भेजने में मूल्य

तेजी से गणना में

for(id key in myDictionary) {
   id value = [myDictionary objectForKey:key];
  // do something with key and obj
}

ब्लॉक में:

[myDictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {

   // do something with key and obj
  }];

3

आपको किसी वैरिएबल को मान असाइन करने की आवश्यकता नहीं है। आप इसे सीधे एक्सेस कर सकते हैं myDict[key]

    for(id key in myDict) {
        NSLog(@"Key:%@ Value:%@", key, myDict[key]);
    }

2

दूसरा तरीका यह है कि डायटस एन्यूमरेटर का उपयोग किया जाए। यहाँ Apple से कुछ नमूना कोड है:

NSEnumerator *enumerator = [myDictionary objectEnumerator];
id value;

while ((value = [enumerator nextObject])) {
    /* code that acts on the dictionary’s values */
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.