0

我有一个多维 NSDictionary,并且在向其中添加数组时遇到问题。我的字典结构如下所示:(由 NSLogging 字典获取)

{
    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";
        }
    );
}

我正在尝试向“Docs”字典添加一个新数组。我正在使用的代码是

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

这失败并出现以下错误

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[__NSArrayM objectForKey:]: unrecognized selector sent to instance 0x7592df0”

如果我尝试使用下面的代码将 Dictionary 添加到 Docs 键而不是数组,它可以工作。

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

此外,我还可以将新数组添加到第一个“项目”数组项,而不是添加到其中的 Docs 对象。

我做错了什么,为什么这不起作用?

谢谢

4

2 回答 2

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);
于 2013-01-16T11:43:08.367 回答
1

考虑到您存储的数据的复杂性(以及您和我显然无法应对这种复杂性),我认为您最好的方法是将其重新实现为自定义对象,其中对象属性以更具体的方式实现。

它很可能会立即支付所需的努力。

更新一些示例对象(我没有完整的要求,所以这将是不完整的):

@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
于 2013-01-16T11:44:39.933 回答