我有一个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(对于每个人),更改数组。
对此任何帮助都将不胜感激!
答案 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];
}