我可以更改NSDictionaries密钥吗?

时间:2010-05-09 10:21:02

标签: objective-c cocoa dictionary foundation

我有一个NSDictionary对象,由NSMutableStrings填充其键和对象。我已经能够通过使用setString:方法更改原始NSMutableString来更改密钥。然而,无论最初用于设置密钥的字符串的内容如何,​​它们的密钥都保持不变。

我的问题是,密钥是否受到保护,不会被更改,这意味着除非我将其删除并将另一个添加到字典中,否则它将始终相同?

感谢。

3 个答案:

答案 0 :(得分:9)

设置项目时,密钥为-copy',因此您无法在之后更改它是无用的。

  

向词典添加条目的方法 - 无论是初始化的一部分(对于所有词典)还是在修改期间(对于可变词典) - 复制每个键参数(键必须符合NSCopying协议)并添加副本到字典。每个对应的值对象都会收到一条保留消息,以确保在字典通过之前不会释放它。

你可以将CFDictionary与kCFTypeDictionaryKeyCallBacks一起使用,或者只是替换项目:

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

答案 1 :(得分:2)

请尝试使用NSMutableDictionary

答案 2 :(得分:2)

您可以创建字典的副本,随时过滤密钥。当使用KVC从JSON填充对象时,我这样做是为了在驼峰和下划线之间进行转换。有关来源,请参阅我的重构库es_ios_utilsESNSCategories.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;
                             }];