2010-05-09 124 views
3

我有一個由NSMutableStrings爲其鍵和對象填充的NSDictionary對象。我已經能夠通過使用setString:方法更改原始NSMutableString來更改密鑰。然而,不管最初用於設置密鑰的字符串的內容如何,​​它們的密鑰都保持不變。我可以更改NSDictionaries鍵嗎?

我的問題是,是不是被改變的關鍵意義,它將永遠是相同的,除非我刪除它並添加另一個字典?

謝謝。

+0

切勿嘗試變異在字典中的一個關鍵。如果你這樣做,字典可能不再能夠找到它。 – JeremyP 2010-05-09 20:03:34

+0

不要這樣做,永遠。得到它了。這是練習的一部分,以確定淺拷貝或深拷貝是否由NSDictionary對象組成。我得到了答案,但沒有得到發生了什麼或爲什麼與關鍵。謝謝你的反饋。 – 2010-05-09 23:23:30

回答

9

鑰匙是-copy'd當物品被設置,所以你不能改變它以後是沒用的。該條目添加到

方法字典-是否作爲初始化的一部分(對於所有字典)或改性過程中(爲可變的字典)-copy每個鍵參數(密鑰必須符合NSCopying協議),並添加到複製詞典。每個對應的值對象都會收到一個保留消息,以確保它在字典完成之前不會被釋放。

你可以使用CFDictionary與kCFTypeDictionaryKeyCallBacks,或只需更換項目:

id value = [dictionary objectWithKey:oldKey]; 
[dictionary setObject:value withKey:newKey]; 
[dictionary removeObjectForKey:oldKey]; 
+0

所以,你說什麼,不管實際集合是可變還是不可變,關鍵是不可變的? – 2010-05-09 18:35:18

+0

@ Mark:是的。 ___ – kennytm 2010-05-09 18:44:13

+0

感謝您的幫助。 – 2010-05-09 23:20:27

2

嘗試使用NSMutableDictionary,而不是。

+0

謝謝,但這不是我使用它的方式的問題。應該說我已經嘗試過使用這兩種類型,在這種情況下,我使用mutableCopy複製方法,然後嘗試更改結果NSMutableDictionary。對不起這是我的錯。 – 2010-05-09 18:33:34

2

您可以創建字典的副本,過濾鍵,當您去。我這樣做是爲了在使用KVC從JSON填充對象時在駝峯大小寫和下劃線之間進行轉換。查看我的重構庫,es_ios_utils,來源。 ESNSCategories.h規定:

@interface NSMutableDictionary(ESUtils) 
    //Changes keys using keyFilter. If keyFilter generates duplicate non-unique keys, objects will be overwritten. 
    -(void)addEntriesFromDictionary:(NSDictionary*)d withKeyFilter:(NSString*(^)(NSString*))keyFilter; 
... 

因此,爲了使所有按鍵上的情況下,你可以這樣做:

NSMutableDictionary *md = [NSMutableDictionary dictionaryWithCapacity:oldDictionary.count]; 
[md addEntriesFromDictionary:oldDictionary 
       withKeyFilter:^NSString*(NSString *key) { 
           return key.uppercaseString; 
          }]; 
相關問題