适合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键有三个要求:
- 支持NSCopying协议
- 合理的哈希方法
- 是平等的
NSIndexPath应该没问题。