我可以更改 NSDictionaries 键吗?
-
04-10-2019 - |
题
我有一个 NSDictionary 对象,它的键和对象由 NSMutableStrings 填充。我已经能够通过使用 setString 更改原始 NSMutableString 来更改密钥:方法。然而,无论最初用于设置密钥的字符串的内容如何,它们的密钥都保持不变。
我的问题是,密钥是否受到保护而不会被更改,这意味着它始终是相同的,除非我删除它并向字典中添加另一个密钥?
谢谢。
解决方案
关键是 -copy
项目设置好后就不能再更改,这是没有用的。
向字典添加条目的方法——无论是作为初始化的一部分(对于所有字典)还是在修改期间(对于可变字典)——复制每个键参数(键必须符合
NSCopying
协议)并将副本添加到字典中。每个对应的值对象都会收到一条保留消息,以确保在字典使用完毕之前它不会被释放。
您可以将 CFDictionary 与 kCFTypeDictionaryKeyCallBacks 一起使用,或者仅替换该项目:
id value = [dictionary objectWithKey:oldKey];
[dictionary setObject:value withKey:newKey];
[dictionary removeObjectForKey:oldKey];
其他提示
尝试使用 NSMutableDictionary
, , 反而。
您可以创建字典的副本,并随时过滤键。我这样做是为了在使用 KVC 从 JSON 填充对象时在驼峰式大小写和下划线之间进行转换。查看我的重构库, 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;
}];
不隶属于 StackOverflow