এনএসমিটেবল অভিধান অ্যাক্সেসের জন্য উদ্দেশ্য ল-সি প্রতিটি লুপের জন্য


268

আমি উদ্দেশ্য-সি তে পরিবর্তনীয় অভিধান কী এবং মানগুলিতে অ্যাক্সেস করতে কিছুটা অসুবিধা পাচ্ছি।

ধরুন আমার কাছে এটি রয়েছে:

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

আমি কী এবং মান সেট করতে পারি। এখন, আমি কেবল প্রতিটি কী এবং মান অ্যাক্সেস করতে চাই, তবে কীগুলির সেটটি সংখ্যা জানি না।

পিএইচপি-তে এটি খুব সহজ, নীচে কিছু:

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

কীভাবে এটি উদ্দেশ্য-সি তে সম্ভব?

উত্তর:


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

এটি NSFastEnumeration প্রোটোকল (10.5+ এবং iOS এ উপলব্ধ) এর সাথে সঙ্গতিপূর্ণ প্রতিটি শ্রেণীর পক্ষে কাজ করে, যদিও NSDictionaryকয়েকটি সংকলনের মধ্যে একটি এটি আপনাকে মানগুলির পরিবর্তে কীগুলি গণনা করতে দেয়। আমি আপনাকে সম্পর্কে পড়তে ফাস্ট শুমার মধ্যে সংগ্রহগুলি টপিক প্রোগ্রামিং

ওহ, আমি অবশ্য যোগ করা উচিত যে আপনার উচিত কখনও একটি সংগ্রহ করার সময় এটা মাধ্যমে enumerating পরিবর্তন করুন।


4
আমি ভাবছিলাম, এটা হওয়া উচিত ছিল না: (এনএসএসটিং * কী [[এক্সইজেড অলকি]] তে) ?? বা এটি আসলে কিছু যায় আসে না।
ফ্লোইউআই সিম্পলইউটিস্টিং.কম 4

6
@ ব্যবহারকারী 768595959৪০৩ একটি অভিধানকে প্রকৃতপক্ষে কীগুলি গণনা করছে ume for (NSString* key in [xyz allKeys])ধারণাগতভাবে একই জিনিস।
জিনাক

[Xyz allKeys] ব্যবহার করুন যদি কীগুলি গণনার সময় আপনার অভিধানটি পরিবর্তন করতে হয়। আমার উত্তর নীচে দেখুন।
ব্রোডি রবার্টসন

এই লুপটি কি সারাক্ষণ একই আদেশ ফেরত দেয়? অথবা টেবিলভিউ বিভাগগুলির জন্য এটি ব্যবহার করার জন্য আমাদের অন্য কোনও উপায়ের দরকার আছে?
ymutlu

1
@ জিমুতলু, কোকো অভিধানগুলি নিরক্ষিত। এর অর্থ হ'ল তারা যে ক্রমটি পুনরাবৃত্তি করে তা যখনই আপনি তাদের পরিবর্তন করবেন।
জেনেক করুন

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
ঠিক আছে ... ১৯৯৪ সালে অবজেক্টমেনামেটর যুক্ত হয়েছিল, ২০০ the সালে (... ইন ...) এবং ব্লকগুলি ২০০৯ সালে যুক্ত করা হয়েছিল en গণনার ব্লক রূপটি প্রাকৃতিক ফলস্বরূপ।
বুবুম

এটি নির্মানের জন্য ... মানের তুলনায় দ্রুত বলে মনে হচ্ছে : oneofthesedaysblog.com/ block
vs-

1
@ লিক্রাইডার, আমি সেই পোস্টে মন্তব্য করেছি, যা প্রকৃতপক্ষে ব্লক-ভিত্তিক গণনার সাথে লুপের জন্য পুরানো সাথে ... তুলনায় নয় ares
কুইন টেলর

কিসের *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

আমি আপনাকে গণনাটি পড়ার পরামর্শ দিচ্ছি : কোকোয়ের জন্য সংগ্রহের প্রোগ্রামিং গাইডের সংগ্রহের উপাদানগুলির অংশটি অনুসরণ করে । আপনার প্রয়োজনের জন্য একটি নমুনা কোড রয়েছে।


এগুলি ভাল লিঙ্কগুলি, যদিও @ জেনাক পোস্ট করা কোডটি অনেক সহজ এবং দ্রুত, যদি আপনি 10.5+ বা আইফোন তৈরি করতে পারেন।
কুইন টেলর

2

দ্রুত গণনা 10.5 এবং আইফোন ওএসে যুক্ত হয়েছিল এবং এটি উল্লেখযোগ্যভাবে দ্রুত, কেবল সিনট্যাকটিক চিনি নয়। আপনি যদি পুরানো রানটাইম (যেমন 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
সত্য, তবে এটি একটি অতিরিক্ত স্বাবলম্বিত অ্যারে তৈরি করে, যা বেশ অপচয় হতে পারে, বিশেষত প্রচুর কীগুলির সাথে অভিধানগুলির জন্য dictionaries
কুইন টেলর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.