基于您cannot在枚举它们时编辑可变集合的事实,这是我可以想出来编辑NSMutableDictionaries数组的最佳解决方案:
__block NSMutableDictionary *tempDict = [NSMutableDictionary dictionaryWithCapacity:1];
__block NSUInteger idx;
[_myArray enumerateObjectsUsingBlock:^(NSMutableDictionary* obj,
NSUInteger indx, BOOL *stop) {
if (// some condition is met) {
tempDict = [obj mutableCopy];
idx = indx;
}
}];
[tempDict setObject:[NSNumber numberWithInt:thisQueryResults] forKey:@"resultsNum"];
[_myArray replaceObjectAtIndex:idx withObject:rowSelected];
这似乎太复杂了(即使对于像obj-c这样的语言)..并且因为它涉及两种数据类型(NSMutableArray和NSMutableDictionary),所以看起来我不能将它们干净地放入类别中。 ?
更新:一条评论问我为什么要创建一个mutablecopy(而不仅仅是一个副本..因为它正在复制一个可变对象)..
假设我刚刚使用了副本..如果我暂停tempDict
这就是我得到的:
// tempDict = [obj copy]
po tempDict
$0 = 0x0b28cc10 <__NSArrayI 0xb28cc10>(
1
)
// tempDict = [obj mutableCopy]
po tempDict
$0 = 0x0b28cc10 <__NSArrayM 0xb28cc10>( //notice the M in __NSArrayM as opposed to I above
1
)
如果是复制..如果我用这样的一行跟着它: [tempDict setObject:[NSNumber numberWithInt:thisQueryResults] forKey:@“resultsNum”];
我收到此错误:
[__NSDictionaryI setObject:forKey:]: unrecognized selector sent to instance 0xb245100
我使用this代码得到了同样的错误:
for (NSUInteger idx = 0; idx < [_myMutableArray count]; idx++) {
NSMutableDictionary* myMutableDict = _myMutableArray[idx];
[myMutableDict setObject:obj forKey:key];
}
更新2: 问题的根源是实例化非可变数组和字典..我是全新的obj-c literals的新手,所以我不知道要创建一个NSMutableArray和NSDictionary,你必须分别这样做: / p>
[@[..] mutableCopy]
[@{..} mutableCopy]
答案 0 :(得分:1)
所以在你的情况下,我不太关注为什么你调用tempDict = [obj mutableCopy];从您编写的条件开始,字典已经可写了。
你可以使用几个技巧。喜欢使用
for (NSUInteger idx = 0; idx < _myArray.count: idx++_ {
NSMutableDictionary *obj = _myArray[idx];
// modify
}
对于NSDictionaries,您可以获取allKeys并遍历该副本。这比使用快速枚举要慢一点,但仍然比执行更正像拳击整数更改的解决方法更快:)
答案 1 :(得分:1)
在你的情况下,你不是只修改数组中的字典。关于如何修改数组中的对象没有任何内容。这是一些等效的代码:
for (NSMutableDictionary *dict in _myArray) {
if (someCondition)
[dict setObject:[NSNumber numberWithInt:thisQueryResults] forKey:@"resultsNum"]
}
如果您绝对需要替换阵列中的对象,则会遇到问题。在这种情况下,如果数组不是很大,我建议和@Markus一样。迭代副本并修改原始副本。
答案 2 :(得分:0)
也许您可以使用KVC并执行:
NSArray<NSMutableDictionary *> *result = [[_myArray filteredArrayUsingPredicate:[NSPredicate withFormat:@"{YOUR CONDITION}"]] valueForKey:@"mutableCopy"];