我有一個NSDictionary,其中我使用我自己的類(NSObject子類)作爲鍵,並希望確保我不包含相同的鍵兩次。但是,由於NSDictionary複製了它的鍵,如果我嘗試檢查某個對象是否在字典中,它從來不會這樣認爲。 例如,NSDictionary中的唯一鍵 - 如何檢查給定的鍵是否是副本?
MyClass* obj = [[MyClass alloc] init];
NSMutableDictionary* dict = [NSMutableDictionary dictionary];
[dict setObject:someObj forKey:obj];
if ([[dict allKeys] contains:obj]) // always returns false
// obj is already in dict
else
// add obj to dict etc.
同樣,如果我想改變與此鍵關聯的對象,它似乎創建一個新條目。
// dict is empty
// say [obj description] gives 'MyClass : 0x1' - (impossible address?)
[dict setObject:someObj forKey:obj];
// dict: { 'MyClass : 0x2' = someObjDesc }
[dict setObject:someOtherObj forKey:obj];
// dict: { 'MyClass : 0x2' = someObjDesc , 'MyClass : 0x3' = someOtherObjDesc }
而且,同樣的事情會導致不能夠從原始對象
[dict setObject:someObj forKey:obj];
[dict objectForKey:obj]; // returns null
所以訪問在字典中的項目,至於獨特性而言,我會是最好關閉跟蹤單獨陣列中的密鑰還是有更好的方法來做到這一點。 我考慮基於一個獨特的變量(如名稱)實現isEqual方法,但並不認爲這是正確的事情。
背景(如果事實證明我可能完全使用了錯誤的東西): 我想跟蹤關於一羣去不同地方的人的信息。所以每個地方的每個人都有一些信息。我所做的是使用嵌套字典,因此主字典的關鍵是一個Person對象和對象的另一個字典。後一個詞典有關鍵的地方和信息作爲對象。我認爲這是Java語法,但是像>(數組包含信息)。我想只能在不存在的情況下添加一個人,添加一個地方(爲每個人),更改數組。
任何這方面的幫助將不勝感激!
我認爲這是一個鍵和一個值之間的差值(_should_我用值來代替呢?)。你會說使用名稱作爲鍵/值,然後用單獨的字典將名稱映射到對象將是一個更好的實現嗎?感謝您花時間回答。 – mmdeas 2010-09-17 19:59:07
剛剛意識到它始終是一個關鍵,它的對象和價值有兩個......只是閱讀Key-Value Coding Fundamentals來找出差異...... – mmdeas 2010-09-17 20:13:26
我想我已經設法根據你所說的以及促使我閱讀的內容來重新設計我的數據結構。謝謝。 – mmdeas 2010-09-17 20:42:34