适合NSDictionary的关键

时间:2012-04-18 00:44:17

标签: objective-c ios macos cocoa-touch cocoa

有没有办法确定一个类是否适合作为键并且可以按预期工作,例如我想在 NSDictionary 中使用 NSIndexPath 作为键但我不确定具有相同整数值的两个不同的 NSIndexPath 实例是否总会返回相同的哈希值。

3 个答案:

答案 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键有三个要求:

  1. 支持NSCopying协议
  2. 合理的-hash方法
  3. 的isEqual
  4. NSIndexPath应该没问题。