适合NSDictionary的关键

Nat*_*Day 13 macos cocoa cocoa-touch objective-c ios

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

小智 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]);
Run Code Online (Sandbox Code Playgroud)

输出结果:

NSIndexPath isEqual的结果:1

NSObject isEqual的结果:0

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

NSIndexPath继承自NSObject,根据NSIndexPath isEqual输出结果,NSIndexPath的isEqual实现应该覆盖超类的isEqual方法,NSIndexPath也覆盖超类的哈希方法.

在attition中,NSIndexPath也符合NSCopying协议.

因此NSIndexPath可以用作NSDictionary的Key类.

  • 但是你需要小心使用NSIndexPath - 框架可能会为表视图提供UIMutableIndexPath对象,并且它们*不总是"匹配"具有相同值的NSIndexPath.(刚用iOS 7测试过) (6认同)