2010-09-17 31 views
0

我有一個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語法,但是像>(數組包含信息)。我想只能在不存在的情況下添加一個人,添加一個地方(爲每個人),更改數組。

任何這方面的幫助將不勝感激!

回答

0

你應該總是使用NSStrings作爲字典的鍵,特別是如果你是Objective-C的新手。有幾件事我可以看到你正在做錯當前的實現 - 你需要閱讀關於NSDictionaries的關鍵需求。

你可以做你想要的字符串作爲鍵的東西 - 人的名字,等

對象在字典中有所有關於某個人的信息:

NSDictionary* personsInfo = [mainDict objectForKey:@"Jane Smith"]; 

NSString* addressLine1 = [personsInfo [email protected]"addressLine1"]; 

--Tom

+0

我認爲這是一個鍵和一個值之間的差值(_should_我用值來代替呢?)。你會說使用名稱作爲鍵/值,然後用單獨的字典將名稱映射到對象將是一個更好的實現嗎?感謝您花時間回答。 – mmdeas 2010-09-17 19:59:07

+0

剛剛意識到它始終是一個關鍵,它的對象和價值有兩個......只是閱讀Key-Value Coding Fundamentals來找出差異...... – mmdeas 2010-09-17 20:13:26

+0

我想我已經設法根據你所說的以及促使我閱讀的內容來重新設計我的數據結構。謝謝。 – mmdeas 2010-09-17 20:42:34

0

簡單的答案是讓MyClass實際上不會複製任何東西。

這會是這樣的改變:

- (id) copyWithZone:(NSZone *)zone { 
    MyClass * foo = (MyClass *)[super copyWithZone:zone]; 
    [foo configureCopy]; 
    return foo; 
} 

要:

- (id) copyWithZone:(NSZone *)zone { 
    return [self retain]; 
} 
+0

啊。即使寫了創建新對象的代碼作爲副本,我也沒有考慮過。如果對象是可變的,那會有問題嗎? – mmdeas 2010-09-17 20:15:42

+0

謝謝你的回答,因爲它把我腦海中的那些單獨的部分聯繫起來,並幫助我更好地理解整體過程,我相信這將會對未來有所幫助。 – mmdeas 2010-09-17 20:41:45

相關問題