Подходящий ключ для NSDictionary

Есть ли способ определить, подходит ли класс в качестве ключа и будет ли он работать так, как вы ожидаете, например, я хочу использовать NSIndexPath в качестве ключа в NSDictionary, но я точно не знаю, являются ли два разных экземпляра NSIndexPath с одинаковым целым числом значения всегда будут возвращать одно и то же хеш-значение.

3 ответа

Решение

Документ Apple NSObject's isEqual гласит:

Если два объекта равны, они должны иметь одинаковое хеш-значение. Этот последний пункт особенно важен, если вы определяете isEqual: в подклассе и намереваетесь поместить экземпляры этого подкласса в коллекцию. Убедитесь, что вы также определили хэш в своем подклассе.

Посмотрите следующий код:

NSIndexPath *indexPath1 = [NSIndexPath indexPathForRow:0 inSection:0];

NSIndexPath *indexPath2 = [NSIndexPath indexPathForRow:0 inSection:0];

NSObject *obj1 = [[NSObject alloc] init];
NSObject *obj2 = [[NSObject alloc] init];

NSLog(@"NSIndexPath isEqual's Result: %d", [indexPath1 isEqual:indexPath2]);
NSLog(@"NSObject isEqual's Result: %d", [obj1 isEqual:obj2]);

Результат на выходе:

NSIndexPath Результат isEqual: 1

NSObject isEqual's Результат: 0

Реализация NSObject isEqual заключается в том, что совместно используются адреса двух объектов, а реализация хеш-функции - это адрес возвращаемого объекта.

NSIndexPath наследуется от NSObject, в соответствии с выходным результатом NSIndexPath isEqual, реализация isInqual NSIndexPath должна переопределять метод isEqual суперкласса, а NSIndexPath также переопределяет метод хеша суперкласса.

Кроме того, NSIndexPath также соответствует протоколу NSCopying.

Таким образом, NSIndexPath может использоваться как класс Key NSDictionary.

То, как объект ведет себя как ключ, зависит от того, как он реализует isEqual:. Это определит, сталкиваются ли два ключа.

Например, пути индексов равны - и, следовательно, будут сталкиваться - когда пути имеют одинаковый набор индексов. Таким образом, два разных объекта, описывающих один и тот же путь, будут восприниматься словарем как один и тот же ключ... возможно, так, как вы этого хотите.

Есть три требования для ключей NSDictionary:

  1. Поддержка протокола NSCopying
  2. Разумный метод -hash
  3. равно

NSIndexPath должно быть в порядке.

Другие вопросы по тегам