我今天在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.我的实施是否有一些副作用?
答案 0 :(得分:6)
首先确保数组包含NSMutableDictionary
个对象,而不是NSDictionary
个对象,以避免在迭代时进行转换:
<击> NSMutableArray * a = [@ [ [@ {@&#34;一个&#34;:@ 11,@&#34;两个&#34;:@ 12,} mutableCopy], [@ {@&#34;一个&#34;:@ 21,@&#34;两个&#34;:@ 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);
}];