2016-01-20 4 views
0

определяет класс User и пользователь имеет член буксировки varibles ->NSString* name , NSSString* pass И я хочу, чтобы хранить их NSSet Conllection так, я переписать - (NSUInteger) метода хеширования как следующегоКак правильно переопределить метод HashCode?

-(NSUIntegar) hash 
{ 
     NSLog(@"Hash Method %@",[self class]); 
     NSUInteger nameHash = name == nil ? 0 : [name hash]; 
     NSUInteger passHash = pass == nil ? 0 : [pass hash]; 
     return nameHash * 31 + passHash; 
} 

main.m файл

NSSet* set = [NSSet setWithObjects: 
        [[User alloc] initWithName:@"nike" pass:@"123"], 
        [[User alloc] initWithName:@"nool" pass:@"456"], 
        [[User alloc] initWithName:@"boow" pass:@"124"], 
        [[User alloc] initWithName:@"enla" pass:@"124"], 
        [[User alloc] initWithName:@"boow" pass:@"124"],//same as member 3 
        nil]; 
    NSLog(@"set count = %ld",[set count]); 
    NSLog(@"%@",NSCollectionToString(set)); 

NSCollectionToString (идентификатор коллекции)

NSString* NSCollectionToString(id collection) 
{ 

NSMutableString* result = [NSMutableString stringWithFormat: 
          @"["]; 
for (id object in collection) { 
    [result appendString:[object description]]; 
    [result appendString:@","]; 
} 
NSUInteger len = [result length]; 

[result deleteCharactersInRange:NSMakeRange(len - 1, 1)]; 
[result appendString:@"]"]; 
return result; 
} 

Но консольный выход: установить счетчик = 5 Почему не 4? где ошибка?

ответ

1

Вам необходимо переопределить как хэш-функции и IsEqual: метод.

Хэш-функция должна возвращать одно и то же значение хэша для любых двух объектов, которые равны в соответствии с isEqual. Он должен вернуть разные значения для объектов, которые не равны в соответствии с isEqual, но это не важно, кроме производительности. Функция по умолчанию isEqual просто сравнивает указатели объектов, поэтому два объекта с одинаковыми данными сравниваются не равными. Вот почему ваши два объекта с равными данными были добавлены в набор.

Смежные вопросы