我有一个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语法,但是像>(数组包含信息)。我想只能在不存在的情况下添加一个人,添加一个地方(为每个人),更改数组。
任何这方面的帮助将不胜感激!
我认为这是一个键和一个值之间的差值(_should_我用值来代替呢?)。你会说使用名称作为键/值,然后用单独的字典将名称映射到对象将是一个更好的实现吗?感谢您花时间回答。 – mmdeas 2010-09-17 19:59:07
刚刚意识到它始终是一个关键,它的对象和价值有两个......只是阅读Key-Value Coding Fundamentals来找出差异...... – mmdeas 2010-09-17 20:13:26
我想我已经设法根据你所说的以及促使我阅读的内容来重新设计我的数据结构。谢谢。 – mmdeas 2010-09-17 20:42:34