有没有一种方法可以确定一个类是否适合作为键并且按预期工作,例如我想在NSDictionary中使用NSIndexPath作为键,但我不确定两个具有相同整数值的不同NSIndexPath实例是否总是返回相同的哈希值。
有没有一种方法可以确定一个类是否适合作为键并且按预期工作,例如我想在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
方法的实现是比较两个对象的地址,
而 hash
方法的实现是返回对象的地址。
NSIndexPath
继承自 NSObject
,根据 NSIndexPath 的 isEqual 输出结果,
它应该重写超类的 isEqual 方法,并且还覆盖了超类的 hash 方法。
此外,NSIndexPath
还符合 NSCopying
协议。
因此,NSIndexPath
可以用作 NSDictionary 的 Key 类。
一个对象作为键的行为取决于它如何实现isEqual:方法。这将确定两个键是否会发生碰撞。
例如,当路径具有相同的索引集时,索引路径是相等的 - 因此会发生碰撞。因此,描述相同路径的两个不同对象将被字典视为相同的键...这可能是你想要的。
NSDictionary键的要求有三个:
NSIndexPath应该没问题。