首页 文章

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

提问于
浏览
1

我今天在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 .

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

1 回答

  • 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]];
    

    然后使用:

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

相关问题