NSDictionary中的唯一键 - 如何检查给定的键是副本?

时间:2010-09-17 19:23:50

标签: objective-c nsdictionary

我有一个NSDictionary,其中我使用自己的类(NSObject子类)作为键,并希望确保我没有包含相同的键两次。但是,因为NSDictionary复制其键,如果我尝试检查对象是否在字典中,它从不认为它是。 例如,

MyClass* obj = [[MyClass alloc] init];
NSMutableDictionary* dict = [NSMutableDictionary dictionary];
[dict setObject:someObj forKey:obj];
if ([[dict allKeys] contains:obj]) // always returns false
    // obj is already in dict
else
    // add obj to dict etc.

同样,如果我想更改与此键关联的对象,它似乎会创建一个新条目。

// dict is empty
// say [obj description] gives 'MyClass : 0x1' - (impossible address?)
[dict setObject:someObj forKey:obj];
// dict: { 'MyClass : 0x2' = someObjDesc }
[dict setObject:someOtherObj forKey:obj];
// dict: { 'MyClass : 0x2' = someObjDesc , 'MyClass : 0x3' = someOtherObjDesc }

此外,同样的事情导致无法从原始对象

访问字典中的项目
[dict setObject:someObj forKey:obj];
[dict objectForKey:obj]; // returns null

因此,就唯一性而言,我最好是在单独的数组中跟踪密钥,还是有更好的方法来做到这一点。 我考虑过基于唯一变量(例如名称)实现isEqual方法,但不认为这是正确的事情。

背景(如果事实证明我可能只是完全使用了错误的东西): 我想跟踪一群人去不同地方的信息。所以每个地方的每个人都有一些信息。我所做的是使用嵌套字典,因此主字典的关键是Person对象,对象是另一个字典。后一个字典具有键位置和信息作为对象。我认为这是Java语法,但类似于> (数组保存信息)。我希望能够仅在尚不存在的情况下添加Person,添加一个Place(对于每个人),更改数组。

对此任何帮助都将不胜感激!

2 个答案:

答案 0 :(得分:0)

您应该始终使用NSStrings作为词典的键,特别是如果您是Objective-C的新手。有一些事情我可以看到你在当前的实现上做错了 - 你需要阅读NSDictionaries的关键要求。

您可以使用字符串作为键 - 人名等来执行您想要的操作。

字典中的对象包含有关某个人的所有信息:

NSDictionary* personsInfo = [mainDict objectForKey:@"Jane Smith"];

NSString* addressLine1 = [personsInfo objectForKey@"addressLine1"];

- 汤姆

答案 1 :(得分:0)

简单的答案是使MyClass实际上不会复制任何内容。

这就像改变一样:

- (id) copyWithZone:(NSZone *)zone {
  MyClass * foo = (MyClass *)[super copyWithZone:zone];
  [foo configureCopy];
  return foo;
}

要:

- (id) copyWithZone:(NSZone *)zone {
  return [self retain];
}