解决
似乎两个-referenceDictionary
都没有包含完全相同的信息......当然!修正了它,现在它完美无缺。
初步问题
自从我开始努力解决这个问题已经过了几个小时,这里是:
我有一个CustomClassA
我用作NSDictionary键(很明显是对象:ForKey:方法)。
起初它根本不起作用,然后我在网上阅读this,that和其他一些内容......
所以我试着通过这样做来覆盖-isEqual:
和-hash
(也许少一点:p):
- (BOOL)isEqual:(id)anObject
{
if([anObject isKindOfClass:[self class]])
{
NSLog(@"HASH = %@", [anObject hash] == [self hash] ? @"YES" : @"NO");
NSLog(@"DICT = %@", [[self referenceDictionary] isEqualToDictionary:[anObject referenceDictionary]] ? @"YES" : @"NO");
return [[self referenceDictionary] isEqualToDictionary:[anObject referenceDictionary]];
}
return false;
}
- (NSUInteger)hash
{
NSUInteger prime = 31;
NSUInteger result = 1;
NSArray* values = [referenceDictionary allValues];
for(id k in values)
{
result = prime * result + [k hash];
}
return result;
}
请注意,我的NSDictionary永远不会包含nil
值,因为我确实会照顾这些值。
无论如何,当调用YES
时,这两个方法都会在其中一个NSDictionary条目上返回[myDict objectForKey:myObject]
。
但是,似乎[myDict objectForKey:myObject]
返回nil
,即使自己“设置”后...... {/ p>
如果有人有时间帮助我解决我的问题,我会感激不尽!
此致 Cehm
修改
好的,为了更清楚这个问题。让我们假设两个类:Artist
和Single
。
然后我想创建一个NSDictionary,其中包含Artist
作为key
,此Artist key
指向NSArray of "Single"s
。
例如,我有以下词典:
@{
artistA : @[song1, song2, song3],
artistB : @[songZ],
artistC : @[songF]
}
但现在问题是我想创建这样的字典:
for(Single* aSong in ArrayOfSingle)
{
Artist* anArtist = [[Artist alloc] initWithArtistName:aSong.artistName];
if([data objectForKey: anArtist] == nil)
{
[data setObject:[[NSMutableArray alloc] init] forKey: anArtist];
} else
{
NSLog(@"exists");
}
[[data objectForKey: anArtist] addObject:aSong];
}
考虑到数据是可变的(简单的NSMutableDictionary)并且我永远不会改变anArtist
(假设ARC仍保留其实例......)。
编辑2:
我超越了NSCopying:
- (id)copyWithZone:(NSZone *)zone {
return [[[self class] allocWithZone:zone] initWithDictionary:referenceDictionary];
}
当我的CustomClass
使用initWithDictionary:
时,我认为通过这样做可以正常工作。
编辑3:
这是initWithDictionary:
-(id) initWithDictionary:(NSDictionary*) dictionary
{
self = [super initWithDictionary:dictionary];
if(self)
{
referenceDictionary = dictionary;
title = [super notNullObjectForKey:@"title"];
name = [super notNullObjectForKey:@"name"];
category = [super notNullObjectForKey:@"category"];
artist = [super notNullObjectForKey:@"artist"];
ad_city = [super notNullObjectForKey:@"ad_city"];
}
return self;
}