【问题标题】:To be a key of an NSDictionary, must a class also implement isEqual: and hash?要成为 NSDictionary 的键,一个类是否也必须实现 isEqual: 和 hash?
【发布时间】:2015-04-22 21:38:49
【问题描述】:

我知道一个类必须实现NSCopying 才能成为NSDictionary 的键,但实现isEqual:hash 也是必要或可取的吗?

如果是,为什么?

【问题讨论】:

    标签: objective-c cocoa nsdictionary nscopying


    【解决方案1】:

    是的。

    为什么?

    考虑访问字典的元素,NSDictionary 如何找到与键关联的对象?通过比较您提供的键值与字典中的键。

    当您实现isEqual: 时,您也实现hash 是一个规则,比较相等的对象必须具有相同的哈希值。进一步考虑字典如何组织键/值对的存储,它使用基于散列的存储结构。

    HTH

    附录

    看到我猜是related question,你还问我是否符合上述“是”:

    如果一个类继承了 isEqual:hash 方法,它们为自己适当地定义了相等性,它不需要用自己的版本覆盖这些方法。如果该类直接继承自 NSObject,这很可能不会为真。

    【讨论】:

    • 支持你的答案比完成我输入的类似答案更容易。
    • @rmaddy - 谢谢 :-) 而且我经常打字很慢。
    • NSObject 实现 isEqual: 通过比较指针,并通过将指针作为哈希值进行哈希。所以任何两个不同的对象都会被认为是不同的。这通常没关系。例如,两个 UIView 只有当它们实际上是同一个视图时才会被认为是相等的。
    【解决方案2】:

    您可以在文档中找到它: https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSDictionary_Class/index.html

    字典中的键值对称为条目。每个条目 由一个表示键的对象和第二个对象组成 那就是那个键的值。在字典中,键是唯一的。 也就是说,单个字典中没有两个键是相等的(根据确定 通过 isEqual:)。通常,键可以是任何对象(前提是它 符合 NSCopying 协议(见下文),但请注意,当 使用键值编码,键必须是字符串(请参阅键值编码 基础)。键和值都不能为 nil;如果你需要 表示字典中的空值,你应该使用 NSNull

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-29
      • 2010-09-20
      • 2012-02-23
      • 1970-01-01
      • 2010-11-09
      • 1970-01-01
      • 2018-07-09
      • 1970-01-01
      相关资源
      最近更新 更多