Есть ли способ определить, подходит ли класс в качестве ключа и будет работать так, как вы ожидаете, например, я хочу использовать NSIndexPath в качестве ключа в NSDictionary но я не знаю наверняка, если два разных экземпляра NSIndexPath с одинаковыми значениями целых чисел всегда будут возвращать одно и то же значение хэш-функции.
Подходящий ключ для NSDictionary
Ответ 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 должен быть в порядке.