سؤال

لدي كائن nsdictionary الذي يسكنه nsmutablestrings لمفاتيحه وكائناته. لقد تمكنت من تغيير المفتاح عن طريق تغيير nsmutablestring الأصلي مع methstring: الطريقة. ومع ذلك ، يبقى المفتاح كما هو بغض النظر عن محتويات السلسلة المستخدمة لتعيين المفتاح في البداية.

سؤالي هو ، هل المفتاح المحمي من تغييره بمعنى أنه سيكون دائمًا هو نفسه ما لم أقم بإزالته وأضف آخر إلى القاموس؟

شكرًا.

هل كانت مفيدة؟

المحلول

المفاتيح -copy"د عندما يتم تعيين العناصر ، لذلك لا يمكنك تغييره بعد ذلك أمر غير مجدي.

الطرق التي تضيف إدخالات إلى القواميس - سواء كجزء من التهيئة (لجميع القواميس) أو أثناء التعديل (للقواعد القابلة للتغيير) - تتوافق كل حجة رئيسية (يجب أن تتوافق المفاتيح مع NSCopying بروتوكول) وأضف النسخ إلى القاموس. يتلقى كل كائن من القيمة المقابلة رسالة الاحتفاظ بتأكد من عدم تعاملها قبل أن يكون القاموس من خلاله.

يمكنك استخدام cfdictionary مع kcftyptictionarykeycallbacks ، أو مجرد استبدال العنصر:

id value = [dictionary objectWithKey:oldKey];
[dictionary setObject:value withKey:newKey];
[dictionary removeObjectForKey:oldKey];

نصائح أخرى

جرب استخدام NSMutableDictionary, ، في حين أن.

يمكنك إنشاء نسخة من القاموس ، وتصفية المفاتيح كما تذهب. أفعل ذلك للتحويل بين حالة الجمال والروح السفلية عند ملء الكائنات من JSON باستخدام KVC. شاهد مكتبة إعادة الطرد الخاصة بي ، es_ios_utils, ، للمصدر. esnscategories.H يوفر:

@interface NSMutableDictionary(ESUtils)
    //Changes keys using keyFilter. If keyFilter generates duplicate non-unique keys, objects will be overwritten.
    -(void)addEntriesFromDictionary:(NSDictionary*)d withKeyFilter:(NSString*(^)(NSString*))keyFilter;
...

لجعل جميع المفاتيح العلوية ، يمكنك أن تفعل شيئًا مثل:

NSMutableDictionary *md = [NSMutableDictionary dictionaryWithCapacity:oldDictionary.count];
[md addEntriesFromDictionary:oldDictionary
               withKeyFilter:^NSString*(NSString *key) { 
                                 return key.uppercaseString;
                             }];
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top