我瞭解,一個班級必須實施NSCopying
才能成爲NSDictionary
的關鍵,但實施isEqual:
和hash
也是必要或可取的?要成爲NSDictionary的關鍵,必須一個類也實現isEqual:和哈希?
如果是,爲什麼?
我瞭解,一個班級必須實施NSCopying
才能成爲NSDictionary
的關鍵,但實施isEqual:
和hash
也是必要或可取的?要成爲NSDictionary的關鍵,必須一個類也實現isEqual:和哈希?
如果是,爲什麼?
是的。
爲什麼?
考慮訪問字典的元素,NSDictionary
如何找到與某個鍵關聯的對象?通過比較您提供的字典中的鍵的關鍵值。
當你執行isEqual:
時,你也執行hash
,規則相同的對象必須有相同的散列值。進一步考慮字典如何組織鍵/值對的存儲,它使用基於散列的存儲結構。
HTH
附錄
看到我猜是related question你也問過我將有資格在上面「是」:
如果一個類繼承isEqual:
和hash
方法適當地爲它自己定義相等性,它不需要用它自己的版本來覆蓋方法。如果該類直接繼承自NSObject
,則很有可能不是。
字典內的鍵值對被稱爲一個條目。每個條目 由表示該鍵的一個對象和作爲該鍵的值的第二對象組成。在字典中,密鑰是唯一的。 也就是說,單個字典中沒有兩個密鑰相等(由isEqual :)確定爲 。通常,一個密鑰可以是任何對象(只要它符合NSCopying協議 - 見下文),但請注意,當使用鍵值編碼時,密鑰必須是字符串(請參閱Key-Value Coding Fundamentals)。無論是關鍵還是價值都不爲零;如果你需要 代表字典中的空值,你應該使用NSNull
提高你的答案比完成類似的答案我打字更容易。 – rmaddy
@rmaddy - 謝謝:-)我經常是打字速度慢的人。 – CRD
NSObject實現isEqual:通過比較指針,並通過將指針作爲散列值進行散列。因此,任何兩個不同的對象將被視爲不同。這通常是好的。例如,如果兩個UIView實際上是相同的視圖,則它們將被視爲相同。 – gnasher729