【发布时间】:2015-04-22 21:38:49
【问题描述】:
我知道一个类必须实现NSCopying 才能成为NSDictionary 的键,但实现isEqual: 和hash 也是必要或可取的吗?
如果是,为什么?
【问题讨论】:
标签: objective-c cocoa nsdictionary nscopying
我知道一个类必须实现NSCopying 才能成为NSDictionary 的键,但实现isEqual: 和hash 也是必要或可取的吗?
如果是,为什么?
【问题讨论】:
标签: objective-c cocoa nsdictionary nscopying
是的。
为什么?
考虑访问字典的元素,NSDictionary 如何找到与键关联的对象?通过比较您提供的键值与字典中的键。
当您实现isEqual: 时,您也实现hash 是一个规则,比较相等的对象必须具有相同的哈希值。进一步考虑字典如何组织键/值对的存储,它使用基于散列的存储结构。
HTH
附录
看到我猜是related question,你还问我是否符合上述“是”:
如果一个类继承了 isEqual: 和 hash 方法,它们为自己适当地定义了相等性,它不需要用自己的版本覆盖这些方法。如果该类直接继承自 NSObject,这很可能不会为真。
【讨论】:
字典中的键值对称为条目。每个条目 由一个表示键的对象和第二个对象组成 那就是那个键的值。在字典中,键是唯一的。 也就是说,单个字典中没有两个键是相等的(根据确定 通过 isEqual:)。通常,键可以是任何对象(前提是它 符合 NSCopying 协议(见下文),但请注意,当 使用键值编码,键必须是字符串(请参阅键值编码 基础)。键和值都不能为 nil;如果你需要 表示字典中的空值,你应该使用 NSNull
【讨论】: