2010-09-17 30 views
0

我有一个NSDictionary,其中我使用我自己的类(NSObject子类)作为键,并希望确保我不包含相同的键两次。但是,由于NSDictionary复制了它的键,如果我尝试检查某个对象是否在字典中,它从来不会这样认为。 例如,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语法,但是像>(数组包含信息)。我想只能在不存在的情况下添加一个人,添加一个地方(为每个人),更改数组。

任何这方面的帮助将不胜感激!

回答

0

你应该总是使用NSStrings作为字典的键,特别是如果你是Objective-C的新手。有几件事我可以看到你正在做错当前的实现 - 你需要阅读关于NSDictionaries的关键需求。

你可以做你想要的字符串作为键的东西 - 人的名字,等

对象在字典中有所有关于某个人的信息:

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

NSString* addressLine1 = [personsInfo [email protected]"addressLine1"]; 

--Tom

+0

我认为这是一个键和一个值之间的差值(_should_我用值来代替呢?)。你会说使用名称作为键/值,然后用单独的字典将名称映射到对象将是一个更好的实现吗?感谢您花时间回答。 – mmdeas 2010-09-17 19:59:07

+0

刚刚意识到它始终是一个关键,它的对象和价值有两个......只是阅读Key-Value Coding Fundamentals来找出差异...... – mmdeas 2010-09-17 20:13:26

+0

我想我已经设法根据你所说的以及促使我阅读的内容来重新设计我的数据结构。谢谢。 – mmdeas 2010-09-17 20:42:34

0

简单的答案是让MyClass实际上不会复制任何东西。

这会是这样的改变:

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

要:

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

啊。即使写了创建新对象的代码作为副本,我也没有考虑过。如果对象是可变的,那会有问题吗? – mmdeas 2010-09-17 20:15:42

+0

谢谢你的回答,因为它把我脑海中的那些单独的部分联系起来,并帮助我更好地理解整体过程,我相信这将会对未来有所帮助。 – mmdeas 2010-09-17 20:41:45

相关问题