【问题标题】:Loop thru array of dictionary and add new key to each dictionary in iOS遍历字典数组并向iOS中的每个字典添加新键
【发布时间】:2014-09-05 10:45:44
【问题描述】:

今天在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. 我的实施有副作用吗?

【问题讨论】:

  • 不管你如何转换一个类——就像你第一种情况下的NSMutableDictionary——因为你基本上在你的数组中创建了不可变NSDictionary对象。简单的类型转换不会改变原始对象的类型。

标签: objective-c nsmutablearray nsarray nsdictionary nsmutabledictionary


【解决方案1】:

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

NSMutableArray* a = [ @[ [@{@"one": @11, @"two": @12, } mutableCopy], [@{@“one”:@21,@“two”:@22,} 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);
}];

【讨论】:

  • 现在你为什么要创建一个已经可变数组的可变副本是零意义的,我打算纠正这个问题,但你是如此热衷于保持这种废话。
  • @holex 因为 Objective-C 文字是不可变的,而不是可变的。
  • 哦,我现在明白了。你刚刚强调了我根本不使用那些疯狂的文字的主要原因。
  • @holex 好吧,在需要不可变对象的情况下,它们在使代码更具可读性方面非常有用,但是我不喜欢在我的答案代码中需要 mutableCopy 并且可能会重写如果这实际上是我的代码,它会使用更传统的alloc/init 方法。
  • 是的,但是在这里,您只是在浪费资源,首先创建一个 immutable 对象,然后将它们复制为 mutable 对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-15
相关资源
最近更新 更多