我需要将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
}
我不知道如何替换最后添加的对象。
尝试在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];
}
向数组添加字典不会复制字典。它将对象(字典)的引用存储到数组中,因此每次都会添加对相同字典的引用。
覆盖字典的内容会更改相同的字典,该字典会在数组中多次存储。
你必须每次都创建一个新的字典。没有理由创建一个可变的。
正如评论所指出的那样,你的问题是由于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