当我尝试将NSDictionary添加到NSMutableArray时,我无法替换添加的最后一个对象

问题描述 投票:0回答:3

我需要将NSDictionary添加到NSMutableArray中。

首先,我创建了一个NSMutableDictionary,其中包含来自其他结构的键值,如下所示:

for (NSString *key in selectedFiltersByUser) {
    [filters_data setObject:key forKey:@"key"];
    [filters_data setObject:selectedFiltersByUser[key] forKey:@"value"];

    // Added filter selected id's into Array for all query_params
    [query_params addObject:filters_data];
}

selectedFiltersByUser是这样的字典:

{
category_id = "XXX";
sort = "last_updated_asc";
status = "rejected_by_seller";
}

并为每个键:这个字典中的值我创建一个新的NSMutableDictionary,如下所示:

{
  key: category_id,
  value: XXX
}

而这个新的NSMutableDictionary像这样添加到NSMutableArray

    for (NSString *key in selectedFiltersByUser) {
    [filters_data setObject:key forKey:@"key"];
    [filters_data setObject:selectedFiltersByUser[key] forKey:@"value"];

    // Added filter selected id's into Array for all query_params
    [query_params addObject:filters_data];
}

但是当将这个NSMutableDictionary添加到NSMutableArray时,它不会替换最后一个对象,我在query_params中得到它:

    {
       key: category_id,
       value: XXX
   },
   {
    key: category_id,
    value: XXX
   },
   {
    key: category_id,
    value: XXX
   }

我需要这个:

{
       key: category_id,
       value: XXX
   },
   {
    key: sort,
    value: last_updated_asc
   },
   {
    key: status,
    value: rejected_by_seller
   }

我不知道如何替换最后添加的对象。

objective-c xcode nsmutablearray nsmutabledictionary
3个回答
1
投票

尝试在for循环中使用[NSMutableDictionary alloc] init],然后添加数据。

因为当你init离开循环时,每次它将进入内部循环并且键是相同的,因此它将用新值覆盖。如果你init进入循环,它将创建一个新的。

for (NSString *key in selectedFiltersByUser) {

    //INIT HERE YOUR DICTIONARY
    NSMutableDictionary *filters_data = [NSMutableDictionary alloc] init];

    [filters_data setObject:key forKey:@"key"];
    [filters_data setObject:selectedFiltersByUser[key] forKey:@"value"];

    // Added filter selected id's into Array for all query_params
    [query_params addObject:filters_data];
}

0
投票

向数组添加字典不会复制字典。它将对象(字典)的引用存储到数组中,因此每次都会添加对相同字典的引用。

覆盖字典的内容会更改相同的字典,该字典会在数组中多次存储。

你必须每次都创建一个新的字典。没有理由创建一个可变的。


0
投票

正如评论所指出的那样,你的问题是由于Objective-C集合的引用语义,即它们包含对现有对象的引用而不是它们的副本。因此,如果您将NSMutableDictionary多次添加到NSMutableArray中作为代码,您最终会得到数组的每个元素都是对同一个字典的引用。已经建议的简单修复是在循环中分配字典:

for (NSString *key in selectedFiltersByUser)
{
   NSMutableDictionary *filters_date = [NSMutableDictionary new];
   [filters_data setObject:key forKey:@"key"];
   [filters_data setObject:selectedFiltersByUser[key] forKey:@"value"];
   [query_params addObject:filters_data];
}

但是,您可以使它更简单,并完全避免这个问题。您已经在索引selectedFiltersByUser,您也可以用类似的方式为filters_data编制索引:

for (NSString *key in selectedFiltersByUser)
{
   NSMutableDictionary *filters_date = [NSMutableDictionary new];
   filters_data[@"key"] = key;
   filters_data[@"value"] = selectedFiltersByUser[key];
   [query_params addObject:filters_data];
}

但是这仍然留给你分配,你可以使用字典文字删除:

for (NSString *key in selectedFiltersByUser)
{
   NSDictionary *filters_date
      = @{ @"key": key,
           @"value": selectedFiltersByUser[key]
         };
   [query_params addObject:filters_data];
}

现在编译器会自动处理分配,你会得到一个NSDictionary。最后的选择是完全放弃filters_date

for (NSString *key in selectedFiltersByUser)
{
   [query_params addObject:@{ @"key": key,
                              @"value": selectedFiltersByUser[key]
                            }
   ];
}

您可能会发现使用字典(和数组)文字可以帮助您避免分配错误并在不需要时创建可变结构。 HTH

© www.soinside.com 2019 - 2024. All rights reserved.