2011-05-11 21 views
1

如果我有一個數據樹是這樣的:iPhone - 更改子子子的NSMutableDictionary價值

NSMutableDictionary (dict1) 
    NSMutableDictionary (dict2) 
     NSMutableArray (array) 
     NSMutableDictionary (dict3) 
      Key1 
      Key2 

     NSMutableDictionary (dict_n) 
      Keyn 
      Keyn 

    NSMutableDictionary (dict_n) 
     NSMutableArray (array_n) 
     NSMutableDictionary (dict_n) 
      Keyn 
      Keyn 

     NSMutableDictionary (dict_n) 
      Keyn 
      Keyn 

如果我想改變密鑰1的值,有沒有比simplier方式.. 。

得到dict1
然後讓dict2
然後讓陣列
然後讓dict3

轉換dict3到一個可變Dicti onary
然後設置KEY1

轉換陣列以一個可變的陣列
然後設置dict3成陣列

轉換dict2到一個可變的字典
然後設定數組dict2

轉換dict1到一個可變的字典
然後將dict2設置爲dict1

這樣做對於每個值我必須改變是一個真正令人頭疼的問題,並且真正耗費代碼。

+1

爲什麼你在做最後三步?另外,是否要將Key1設置爲數組中所有字典中的某個值或者只有一個字典? – 2011-05-11 01:36:55

+0

@Bavarious提供了一個很好的觀點:如果您只是在現有的dict3中更改某個鍵的值,則無需對dict1,dict2或數組執行任何操作。 – Caleb 2011-05-11 02:50:12

+0

@Bavarious:這是錯誤的。從Dictionary獲取對象時,它將返回一個非可變對象。所以你不能在裏面設置一個值。爲此,您必須將其轉換爲NEW Mutable對象,設置要更改的值,然後將其插入到其父項中以使更改可用。我已經更新了這個問題來反映這一點。 – Oliver 2011-05-12 12:44:51

回答

2

除非你有一個指向該對象的指針,否則你不能發送消息給對象,所以從基本意義上來說,對你的問題的答案是否定的,沒有別的辦法。

但是,我們假設您擁有的這種數據結構代表了某種數據模型。因此,它可能應該包含在某種理解其部分的模型類中,並且該類應該是唯一需要了解數據存儲方式的類。模型類應該爲數據提供更高級的接口。說dict3代表一個車隊中的一個特定車輛,而關鍵字是諸如「vehicleTag」,「registrationDate」,「purchaseDate」等等。也許dict2的字典級別在不同地區的艦隊,dict2本身代表東北艦隊。然後VehiclePool類,模型類存儲所有數據,可能提供類似的方法:

-registrationDateForVehicle:(int)vehicleIndex inFleet:(NSString*)fleetKey; 
-setRegistrationDate:(NSDate*)regDate forVehicle:(int)vehicleIndex inFleet:(NSString*)fleetKey; 

我不知道我真的想這樣的API - 我寧願獲取列表對於一個給定的車隊來說,然後對那些具有較簡單的訪問者的車輛進行操作,但是你似乎想要避免幾個級別的訪問者。這裏的要點是,你不應該寫大量的代碼來完成你需要的操作;你應該編寫知道如何訪問數據然後調用這些數據的方法。

2

NSDictionary文檔狀態:

In general, a key can be any object (provided that it conforms to the NSCopying protocol—see below), but note that when using key-value coding the key must be a string (see 「Key-Value Coding Fundamentals」).

因此,如果你的鑰匙(和子鍵)都是字符串,你可以做以下的檢索和設定值:

id myNestedObject = [topLevel valueForKeyPath:@"firstKey.secondKey.thirdKey"]; 
[topLevel setObject:newNestedObject forKeyPath:@"firstKey.secondKey.thirdKey"]; 
+0

它不像那樣簡單,因爲數組。 – 2011-05-11 01:45:10

+0

好點,我沒有注意到陣列。也許@Oliver可以將NSArray更改爲字典,其中鍵爲「0」,「1」,「2」,... ;-) – 2011-05-11 02:02:59