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

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

Ответ 1

Apple NSObject isEqual document говорит:

Если два объекта равны, они должны иметь одинаковое значение хэша. Этот последний момент особенно важен если вы определяете 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 Result: %d", [indexPath1 isEqual:indexPath2]);
NSLog(@"NSObject isEqual Result: %d", [obj1 isEqual:obj2]);

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

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

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

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

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

В приложении NSIndexPath также соответствует протоколу NSCopying.

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

Ответ 2

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

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

Ответ 3

Для ключей NSDictionary существует три требования:

  • Поддержка протокола NSCopying
  • Разумный метод -hash
  • IsEqual

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