我今天在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 .
QUESTION
1.用较少的代码可以做到这一点吗?
2.我的实施是否有一些副作用?
1 回答
首先确保数组保存
NSMutableDictionary
对象,而不是NSDictionary
对象,以避免在迭代时转换:NSMutableArray * a = [@ [[@ {@“one”:@ 11,@“two”:@ 12,} mutableCopy],[@ {@“one”:@ 21,@“two”:@ 22,} mutableCopy]] mutableCopy];
(我不喜欢那个代码,请改用它):
然后使用: