循环遍历字典数组并为iOS中的每个字典添加新密钥

时间:2014-07-15 09:40:37

标签: objective-c nsmutablearray nsarray nsdictionary nsmutabledictionary

我今天在iOS中发现了一些奇怪的东西,我解决了它,但我想问一下是否有更好的(更多iOS)解决方案。

我想做的是:
循环遍历字典数组并为iOS中的每个字典添加新密钥

这是代码(这不是我的原始代码,它更复杂,但我完成了这个代码以说明简单点):

- (void)testLoopThruArrayOfDictionaryAndAddNewKeyToEachDictionary
{
    NSMutableArray* a = [[NSMutableArray alloc] init];
    [a addObjectsFromArray:@[ @{@"one": @11, @"two": @12, } ]];
    [a addObjectsFromArray:@[ @{@"one": @21, @"two": @22, } ]];

    NSLog(@"%@", a);

    /*
    // NOT WORKING
    for (NSMutableDictionary* dict in a)
    {
        // -[__NSDictionaryI setObject:forKey:]: unrecognized selector sent to instance 0x8b5bca0
        [dict setObject:@3 forKey:@"three"]; 
    }
    */

    // THIS IS WORKING
    for (int i=0; i<[a count]; i++)
    {
        // make tmp copy
        NSMutableDictionary *tmpA = [a[i] mutableCopy];

        [tmpA setObject:@3 forKey:@"three"];

        // put to new value, because I use this [allValidMoves[i] mutableCopy];
        a[i] = tmpA;
    }

    NSLog(@"%@", a);
}

正如您所看到的,第二个循环正在运行,但我需要复制数组,然后将该副本放回到数组中。
即使我要求NSMutableDictionary,第一个循环也会返回NSDictionary。

问题
1.用较少的代码可以做到这一点吗?
2.我的实施是否有一些副作用?

1 个答案:

答案 0 :(得分:6)

首先确保数组包含NSMutableDictionary个对象,而不是NSDictionary个对象,以避免在迭代时进行转换:

<击>     NSMutableArray * a = [@ [         [@ {@&#34;一个&#34;:@ 11,@&#34;两个&#34;:@ 12,} mutableCopy],         [@ {@&#34;一个&#34;:@ 21,@&#34;两个&#34;:@ 22,} mutableCopy]     ] mutableCopy];

(我不喜欢那段代码,请改用它):

NSMutableArray *a = [NSMutableArray new];
[a addObject:[NSMutableDictionary dictionaryWithObjectsAndKeys:@(11), @"one", @(12), @"two", nil]];
[a addObject:[NSMutableDictionary dictionaryWithObjectsAndKeys:@(21), @"one", @(22), @"two", nil]];

然后使用:

[a enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    NSMutableDictionary *dict = (NSMutableDictionary *)obj;
    dict[@"three"] = @(3);
}];