【问题标题】:Replacing values in nested NSDictionary duplicates values in NSArray替换嵌套 NSDictionary 中的值会重复 NSArray 中的值
【发布时间】:2015-10-12 18:56:51
【问题描述】:

我正在替换嵌套 NSDictionary 中的值,但是一旦我这样做,它就会复制我的 NSArray 中的项目数。它包含旧条目,以及新修改的条目:

        SharedManager *manager = [SharedManager shared];
        NSMutableArray *array = [manager.items mutableCopy];
        for (NSMutableDictionary *notes in [manager.items mutableCopy]) {
            NSMutableDictionary *tempDictionary = [[NSMutableDictionary alloc] init];
            tempDictionary = [notes mutableCopy];
            [tempDictionary setObject:@1 forKey:@"key"];
            [array addObject:tempDictionary];
        }

        DebugLog(@"%@", [manager items]);

我只想用新修改的 NSArray 替换旧的 NSArray。

【问题讨论】:

  • 在循环之后,您似乎没有对 array 对象做任何事情。您没有将其分配给任何东西(即 manager.items)——您的意思是?
  • 是的,因为数组是一个不可变对象,所以我创建了一个新对象。
  • 对,但我的意思是,当您最后调试日志manager.items 时,您只是在转储原始数组。您的代码 sn-p 显示您在 array 上做了大量工作,然后将其丢弃而无需更改管理器指向它。循环后是否需要manager.items = array;
  • 代码中充满了冗余。您在 for 语句中为数组创建了一个额外的 mutableCopy,并在每次迭代时分配和初始化一个可变字典,只在下一行将其丢弃,然后正如@BenZotto 所说,您不对array 做任何事情。但假设这是一个疏忽,你在array 上调用addObject 所以当然你会有更多的元素。你到底想达到什么目的?看起来您应该使用整数数组迭代而不是快速枚举,以便您可以更新索引而不是调用 addObject

标签: ios objective-c


【解决方案1】:

数组接收这里的所有项目

 NSMutableArray *array = [manager.items mutableCopy];

然后,在

处再次添加它
[array addObject:tempDictionary];

第一行应该替换为

NSMutableArray *array = [NSMutableArray array];

【讨论】:

    【解决方案2】:

    我认为您可能可以更简单地做到这一点。如果manager.items 是代码所暗示的可变字典数组,那么您可以更新字典而不更改保存它们的(不可变)数组:

    SharedManager *manager = [SharedManager shared];
    for (NSMutableDictionary *notes in manager.items)  // loop through every dict in the array 
        [notes setObject:@1 forKey:@"key"];            // update dict in-place
    }
    

    【讨论】:

      【解决方案3】:

      您应该从头开始创建新数组,而不是使用现有数组的副本 + 我建议删除多余的 mutableCopy 调用:

      SharedManager *manager = [SharedManager shared];
      NSMutableArray *array = [NSMutableArray new];
      for (NSDictionary *notes in manager.items) {
          NSMutableDictionary* newNotes = [notes mutableCopy];
          [newNotes setObject:@1 forKey:@"key"];
          [array addObject:newNotes];
      }
      

      【讨论】:

        【解决方案4】:

        一种可能的解决方案是创建一个新数组并在最后将其重新分配给manager.items

        SharedManager *manager = [SharedManager shared];
        NSMutableArray *array = [NSMutableArray array];
        for (NSDictionary *notes in manager.items) {
            NSMutableDictionary *tempDictionary = [notes mutableCopy];
            [tempDictionary setObject:@1 forKey:@"key"];
            [array addObject:tempDictionary];
        }
        
        manager.items = [array copy]; // make it immutable again
        DebugLog(@"%@", [manager items]);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多