一种更快的方式来改变NSMutableDictionaries数组

时间:2013-05-10 09:15:15

标签: ios objective-c nsmutablearray enumeration nsmutabledictionary

基于您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]

3 个答案:

答案 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"];