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:]: 認識されないセレクターがインスタンス 0x7592df0 に送信されました'

以下のコードを使用して、配列の代わりに Dictionary を Docs キーに追加しようとすると、機能します。

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

さらに、新しい配列を最初の "Projects" 配列アイテムに追加することもできますが、その中の 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 に答える