【问题标题】:Can I change an NSDictionary's key?我可以更改 NSDictionary 的密钥吗?
【发布时间】:2011-02-17 08:19:05
【问题描述】:

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

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

谢谢。

【问题讨论】:

  • 永远不要尝试改变字典中的键。如果你这样做了,字典可能再也找不到它了。
  • 永远不要这样做。知道了。这是确定浅拷贝还是深拷贝是由 NSDictionary 对象制作的练习的一部分。我得到了很好的答案,但不知道发生了什么或为什么用钥匙。感谢您的意见。

标签: objective-c cocoa dictionary foundation


【解决方案1】:

尝试改用NSMutableDictionary

【讨论】:

  • 谢谢,但这不是我使用它的真正问题。应该说我已经尝试使用这两种类型,在这种情况下我使用 mutableCopy 复制方法,然后尝试更改生成的 NSMutableDictionary。对不起,我的错。
【解决方案2】:

设置项目时键是-copy'd,所以以后不能更改也没用。

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

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

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

【讨论】:

  • 那么您的意思是,无论实际集合的可变性是可变还是不可变,密钥都是不可变的?
【解决方案3】:

您可以创建字典的副本,随时过滤键。我这样做是为了在使用 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;
                             }];

【讨论】:

    猜你喜欢
    • 2011-12-06
    • 1970-01-01
    • 2010-11-01
    • 1970-01-01
    • 2023-03-14
    • 2022-12-18
    • 2015-10-08
    • 2021-10-21
    • 1970-01-01
    相关资源
    最近更新 更多