0

我有一個mutlidimensional NSDictionary,並且在添加數組時遇到問題。我的字典結構是這樣的:不能添加NSArray到NSDictionary

{ 
    Downloaded =  { 
     017315 = "2013-01-16 11:26:33 +0000"; 
    }; 
    Projects = (
     { 
      Docs = { }; 
      "Last Downloaded" = "2013-01-16 10:16:05 +0000"; 
      "Project Name" = "Baring Australia Fund"; 
     } 
    ); 
} 

我想一個新的陣列添加到「文檔」字典(採取NSLogging字典)。我使用的代碼是

[[[[myDict objectForKey:@"Projects"] objectAtIndex:0] objectForKey:@"Docs"] setObject:[NSMutableArray array] forKey:@"test"]; 

這與以下錯誤

終止應用程序由於未捕獲的異常「NSInvalidArgumentException」,原因失敗:「 - [__ NSArrayM objectForKey:]:無法識別的選擇發送到實例0x7592df0 '

如果我嘗試使用下面的代碼將字典添加到文檔鍵而不是數組,它就可以工作。

[[[[myDict objectForKey:@"Projects"] objectAtIndex:0] objectForKey:@"Docs"] setObject:[NSMutableDictionary dictionary] forKey:@"test"]; 

另外,我也能在它的新陣列添加到第一個「項目」排列項目,只是沒有到文檔對象。

我在做什麼錯,爲什麼這不起作用?

感謝

+0

你確定了'Projects'陣列是一個'NSMutableArray'而不是NSArray的' '(可變性是這裏的問題)。 – trojanfoe

+0

這是可以肯定的,因爲他能夠在其中添加字典。 –

+0

@AnoopVaidya true。 – trojanfoe

回答

2

[[[myDict objectForKey:@"Projects"] objectAtIndex:0] objectForKey:@"Docs"]這是回訪你的數組。

而你在這個數組中使用setObject:forKey:。

[someArray setObject: forKey:]是你的編譯器看到並拋出錯誤。

編輯:

我檢查了你的代碼,它很好。而上述錯誤來自其他地方。

我模仿你的代碼,它工作正常。看看,我測試:

NSMutableDictionary *myDict=[NSMutableDictionary new]; 

NSMutableDictionary *downloadedDict=[NSMutableDictionary dictionaryWithObject:@"2013-01-16 11:26:33 +0000" forKey:@"017315"]; 
[myDict setObject:downloadedDict forKey:@"Downloaded"]; 

NSMutableDictionary *docsDict=[NSMutableDictionary new]; 
NSMutableDictionary *emptyDict=[NSMutableDictionary new]; 
[docsDict setObject:emptyDict forKey:@"Docs"]; 
[docsDict setObject:@"2013-01-16 10:16:05 +0000" forKey:@"Last Downloaded"]; 
[docsDict setObject:@"Baring Australia Fund" forKey:@"Project Name"]; 
NSMutableArray *projects=[NSMutableArray new]; 
[projects addObject:docsDict]; 


[myDict setObject:projects forKey:@"Projects"]; 

// NSLog(@"%@",mainDict); 
//[[[[myDict objectForKey:@"Projects"] objectAtIndex:0] objectForKey:@"Docs"] setObject:[NSMutableDictionary dictionary] forKey:@"test"]; 
[[[[myDict objectForKey:@"Projects"] objectAtIndex:0] objectForKey:@"Docs"] setObject:[NSMutableArray array] forKey:@"test"]; 

NSLog(@"%@",myDict); 
+0

然後,用你自己的話說:「他能夠在其中添加字典」。 – trojanfoe

+0

@「文檔」鍵是一個字典,而不是一個數組。我確認通過NSLog測試(@「%i」,[[[myDict objectForKey:@「Projects」] objectAtIndex:0] objectForKey:@「Docs」] isKindOfClass:[NSDictionary class]]); – Typhoon101

+0

根據你的錯誤,我寫了這些。等等,我正在創建同一級別的字典,並會檢查...並會來找你。 –

1

我覺得你最好的辦法,考慮到要存儲的數據的複雜性(兩者你和我顯然無法應付這種複雜性)是重新實現此作爲用更具體的方式實現對象屬性的自定義對象。

它很可能會立即付出所需的努力。

UPDATE一些示例對象(我沒有完整的需求,所以這將是不完整的):

@interface Project : NSObject 
{ 
    NSString *_name; 
    NSMutableArray *_documents; // Array of document names? 
    NSDate *_lastDownloaded; 
} 

// @property for each ivar 

@end 

@interface Projects : NSObject 
{ 
    NSDate *_lastDownloaded; 
    NSMutableArray *_projects;  // Array of Project objects 
} 

// @property for each ivar 

@end 
+0

是的,這是一個有效的原因,他是第4層... –

+0

雅這是一個更好的方法。你能否詳細說明他應該在這裏帶哪些物品。有些提示會很好。 –

+0

我同意對象會好得多,但是這些數據正在被寫入並從plist文件中讀取,該文件在應用程序會話的持續時間內發生變化。對象會工作,但我仍然最終需要一個嵌套數組。 – Typhoon101