适合NSDictionary的键

有没有一种方法来确定一个类是否适合作为一个关键,并会像你期望的那样工作,例如我想在NSDictionary中使用NSIndexPath作为关键字,但我不确定是否有两个不同的NSIndexPath实例具有相同的整数值将始终返回相同的散列值。

苹果的NSObject的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的结果:0

NSObject isEqual的实现是comare两个对象的地址,hash实现是返回对象的地址。

NSIndexPath是从NSObjectinheritance的,根据NSIndexPath的isEqual输出结果,NSIndexPath的isEqual实现应该重写超类的isEqual方法,NSIndexPath也覆盖超类的hash方法。

在这种情况下,NSIndexPath也符合NSCopying协议。

所以NSIndexPath可以用作NSDictionary的Key类。

对象如何作为一个关键取决于它如何实现isEqual :. 这将决定两个键是否碰撞。

例如,当path具有相同的一组索引时,索引path是相等的,因此会发生冲突。 因此,描述相同path的两个不同的对象将被字典看作是相同的密钥…可能你希望如何。

对于NSDictionary键有三个要求:

  1. 支持NSCopying协议
  2. 合理的哈希方法
  3. 是平等的

NSIndexPath应该没问题。