Tecla adecuada para NSDictionary

¿Hay alguna forma de determinar si una class es adecuada como key y funcionará como usted espera, por ejemplo, quiero usar NSIndexPath como una key en NSDictionary, pero no sé con certeza si dos instancias diferentes de NSIndexPath con el mismo número integer los valores siempre devolverán el mismo valor de hash.

El documento isEqual de NSObject de Apple dice:

Si dos objects son iguales, deben tener el mismo valor de hash. Este último punto es particularmente importante si defines isEqual: en una subclass e intenta poner instancias de esa subclass en una colección. Asegúrate de definir hash en tu subclass.

Mira el siguiente código:

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]); 

Resultado de la producción:

Resultado de NSIndexPath isEqual: 1

Resultado de NSObject isEqual: 0

La implementación de NSObject isEqual es aquella que incluye la dirección de dos objects, y la implementación de hash es la dirección del object de retorno.

NSIndexPath se henetworkinga de NSObject , de acuerdo con el resultado de salida NSIndexPath isEqual, la implementación isEqual de NSIndexPath debe anular el método isEqual de la superclass, y NSIndexPath también anula el método hash de la superclass.

En attition, NSIndexPath también cumple con el protocolo NSCopying.

Entonces, NSIndexPath se puede usar como la class key de NSDictionary.

Cómo se comporta un object como una key depende de cómo implementa isEqual :. Esto determinará si dos keys chocan.

Por ejemplo, las routes de índice son iguales, y por lo tanto colisionarán, cuando las routes tienen el mismo set de índices. Entonces, el dictionary verá dos objects distintos que describen la misma ruta como la misma key … probablemente cómo te gustaría que fuera.

Hay tres requisitos para las keys NSDictionary:

  1. Apoye el protocolo NSCopying
  2. Razonable -hash method
  3. es igual

NSIndexPath debería estar bien.