有没有办法确定一个类是否适合作为键并且可以按预期工作,例如我想在 NSDictionary 中使用 NSIndexPath 作为键但我不确定具有相同整数值的两个不同的 NSIndexPath 实例是否总会返回相同的哈希值。
答案 0 :(得分:9)
Apple的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两个对象的地址, 和哈希实现是返回对象的地址。
根据NSIndexPath isEqual输出结果,NSIndexPath 继承自 NSObject , NSIndexPath的isEqual实现应该覆盖超类的isEqual方法,NSIndexPath也会覆盖超类的哈希方法。
在attition中,NSIndexPath也符合NSCopying协议。
因此NSIndexPath可以用作NSDictionary的Key类。
答案 1 :(得分:4)
对象如何表现为键取决于它如何实现isEqual:。这将确定两个键是否发生碰撞。
例如,当路径具有相同的索引集时,索引路径相等 - 因此会发生冲突。所以描述相同路径的两个不同对象将被字典视为相同的键...可能你会喜欢它。
答案 2 :(得分:2)
NSDictionary键有三个要求:
NSIndexPath应该没问题。