একটি এনএস পরিবর্তনযোগ্য অভিধানের মাধ্যমে লুপিং


93

কীগুলি নির্বিশেষে আমি কোনও এনএসমিটেবলড অভিধানে সমস্ত বস্তুর মধ্য দিয়ে কীভাবে লুপ করব?

উত্তর:


210

একটি স্ট্যান্ডার্ড উপায় এটি দেখতে হবে

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

যদি কেবল এমন কিছু করার উপায় থাকে for (id key, value in myDict)তবে তা নিখুঁত হবে।
লুইস আর্টোলা

4
id key in myDict.allKeysঅভিধানের পরিবর্তে (যেমন ) কীগুলির মাধ্যমে পুনরাবৃত্তি করা ভাল । এটি আপনাকে অভিধানটি পরিবর্তন করতে দেয়, যা আপনি যা করতে চান তা হতে পারে।
মার্সেল সালাতে 21

29

তুমি ব্যবহার করতে পার

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

যদি আপনার টার্গেট ওএস ব্লকগুলিকে সমর্থন করে।


22

আপনি আপনার মানগুলির [dict allValues]একটি পেতে ব্যবহার করতে পারেন NSArray। সচেতন হন যে এটি কলগুলির মধ্যে কোনও অর্ডারের গ্যারান্টি দেয় না।


4
আমি এটি একটি (অভিধানে আইডি কী) এর উপরে ব্যবহার করব, বিশেষত একটি পরিবর্তনীয় অভিধানে, যেহেতু পরেরটি একটি অদ্ভুত ত্রুটি নিক্ষেপ করে যদি অভিধানটি অঙ্কিত করার সময় সংশোধন করা হয়।
sigsegv

"এটা নিশ্চয়তা দেয় না" - এটি প্রায়শই প্রয়োজন হয় (অধিকাংশ ভাষা নেই গ্যারান্টি অর্ডার অভিধান এর একটি সংস্করণ আছে) - এটা আছে বাস্তবে অর্ডার সংরক্ষণ?
অ্যাডাম

ম্যাকোস এক্স-এ অ্যাডাম @ আমার বেশ মিশ্রণ অর্ডার ছিল (সন্নিবেশের আদেশ নয়, বর্ণমালা নয়, কিছুই নয়), তবে কলগুলির মধ্যে সামঞ্জস্যপূর্ণ।
jv42

যদি ম্যাপিংয়ের বিষয়টি বিবেচনা না করে তবে এনএসডিকারি ব্যবহার করবেন কেন?
স্টিফেন

4
@ স্টেফেন সাধারণত এটি কোথাও গুরুত্বপূর্ণ এবং অন্য কোথাও আসে না। আপনি অনন্য কী বাধাও পান যা কিছু ক্ষেত্রে কার্যকর হতে পারে।
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

আর একটি উপায় হ'ল ডিক্টস এনুমিউরেটর ব্যবহার করা। অ্যাপল থেকে কিছু নমুনা কোড এখানে দেওয়া হয়েছে:

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

while ((value = [enumerator nextObject])) {
    /* code that acts on the dictionary’s values */
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.