我有一個由NSMutableStrings爲其鍵和對象填充的NSDictionary對象。我已經能夠通過使用setString:方法更改原始NSMutableString來更改密鑰。然而,不管最初用於設置密鑰的字符串的內容如何,它們的密鑰都保持不變。我可以更改NSDictionaries鍵嗎?
我的問題是,是不是被改變的關鍵意義,它將永遠是相同的,除非我刪除它並添加另一個字典?
謝謝。
我有一個由NSMutableStrings爲其鍵和對象填充的NSDictionary對象。我已經能夠通過使用setString:方法更改原始NSMutableString來更改密鑰。然而,不管最初用於設置密鑰的字符串的內容如何,它們的密鑰都保持不變。我可以更改NSDictionaries鍵嗎?
我的問題是,是不是被改變的關鍵意義,它將永遠是相同的,除非我刪除它並添加另一個字典?
謝謝。
鑰匙是-copy
'd當物品被設置,所以你不能改變它以後是沒用的。該條目添加到
方法字典-是否作爲初始化的一部分(對於所有字典)或改性過程中(爲可變的字典)-copy每個鍵參數(密鑰必須符合
NSCopying
協議),並添加到複製詞典。每個對應的值對象都會收到一個保留消息,以確保它在字典完成之前不會被釋放。
你可以使用CFDictionary與kCFTypeDictionaryKeyCallBacks,或只需更換項目:
id value = [dictionary objectWithKey:oldKey];
[dictionary setObject:value withKey:newKey];
[dictionary removeObjectForKey:oldKey];
所以,你說什麼,不管實際集合是可變還是不可變,關鍵是不可變的? – 2010-05-09 18:35:18
@ Mark:是的。 ___ – kennytm 2010-05-09 18:44:13
感謝您的幫助。 – 2010-05-09 23:20:27
嘗試使用NSMutableDictionary
,而不是。
謝謝,但這不是我使用它的方式的問題。應該說我已經嘗試過使用這兩種類型,在這種情況下,我使用mutableCopy複製方法,然後嘗試更改結果NSMutableDictionary。對不起這是我的錯。 – 2010-05-09 18:33:34
您可以創建字典的副本,過濾鍵,當您去。我這樣做是爲了在使用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;
}];
切勿嘗試變異在字典中的一個關鍵。如果你這樣做,字典可能不再能夠找到它。 – JeremyP 2010-05-09 20:03:34
不要這樣做,永遠。得到它了。這是練習的一部分,以確定淺拷貝或深拷貝是否由NSDictionary對象組成。我得到了答案,但沒有得到發生了什麼或爲什麼與關鍵。謝謝你的反饋。 – 2010-05-09 23:23:30