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

Web*_*ode 1 objective-c nsdictionary nsmutablearray nsarray 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);
}
Run Code Online (Sandbox Code Playgroud)

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

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

tro*_*foe 6

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

NSMutableArray*a = [@ [[@ {@"one":@ 11,@"two":@ 12,} mutableCopy],[@ {@"one":@ 21,@"two":@ 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]];
Run Code Online (Sandbox Code Playgroud)

然后使用:

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