Шаг 1. Решите, какие переменные / состояние экземпляра используются для определения равенства.Рекомендуется убедиться, что свойства для них существуют (они могут быть частными свойствами, объявленными в расширении класса , если хотите).
Шаг 2. Напишите хеш-функцию на основе этих переменных экземпляра.Если все свойства, которые учитываются, являются объектами, вы можете просто скопировать их хэши вместе.Вы также можете напрямую использовать C-объекты и т. Д.
Шаг 3. Запись isEqual:
Нормальный шаблон, вероятно, сначала проверяет, что оба объекта находятся в классе или подклассе метода, в котором определено isEqual:
а затем проверить равенство для всех свойств.
Так, если у класса Person есть свойство name (тип NSString) и свойство number (тип int), которые вместе определяют уникального персонажа, hash
может быть:
-(NSUInteger) hash
{
return [[self name] hash] ^ [self number];
}
isEqual:
может быть
-(BOOL) isEqual: (id) rhs
{
BOOL ret = NO;
if ([rhs isKindOfClass: [Person class]]) // do not use [self class]
{
ret = [[self name] isEqualToString: [rhs name]] && [self number] == [rhs number];
}
return ret;
}
Я не думаю, что это указано как явное требование в документе, но, вероятно, предполагается, что равенство симметрично и транзитивно, т. Е.
[a isEqual: b] == [b isEqual: a]
для всех a и b [a isEqual: b] && [b isEqual: c]
подразумевает [a isEqual: c]
для всех a, b, c
Поэтому вам следует быть осторожным, если вы переопределите isEqual:
для подклассовчтобы убедиться, что это работает в обе стороны.Это также, почему комментарий, не используйте [self class]
выше.