Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 替换数组中的对象不会';不起作用,但添加一个新的会起作用_Objective C_Arrays_Nsarray - Fatal编程技术网

Objective c 替换数组中的对象不会';不起作用,但添加一个新的会起作用

Objective c 替换数组中的对象不会';不起作用,但添加一个新的会起作用,objective-c,arrays,nsarray,Objective C,Arrays,Nsarray,我有一个函数,用于获取一个对象,如果数组中已经存在具有相同标识符字符串的对象,则更新该对象,如果不存在,则添加该对象。添加部件可以工作,但由于某些原因,更新功能会丢失数据 这是我的密码: - (void)addOrUpdateGroup:(Object *)myObject { for (H2Group *existingObject in objectsArray) { if ([existingObject.identifier isEqualToString:myO

我有一个函数,用于获取一个对象,如果数组中已经存在具有相同标识符字符串的对象,则更新该对象,如果不存在,则添加该对象。添加部件可以工作,但由于某些原因,更新功能会丢失数据

这是我的密码:

- (void)addOrUpdateGroup:(Object *)myObject
{
    for (H2Group *existingObject in objectsArray) {
        if ([existingObject.identifier isEqualToString:myObject.identifier]) {
            [objectsArray replaceObjectAtIndex:[objectsArray indexOfObject:existingObject] withObject:myObject];
            return;
        }
    }
    [objectsArray addObject:myObject];    
}
当使用数组中具有对应对象的对象调用此方法时,它会执行,但似乎不会替换该对象

通过使用断点和日志,我确定:

  • 进入循环后,使用现有标识符检测新对象效果良好
  • 新对象是完整的,如果我改为使用
    [objectsArray addObject:myObject]
    ,则该对象被正确添加
  • 如果将
    replaceObjectAtIndex:0与object:myObject一起使用,则会出现相同的问题

如果您有任何想法,我们将不胜感激。

这样的想法更有效、更安全,而且(在我看来)更具可读性:

- (void)addOrUpdateGroup:(Object *)myObject {
    NSUInteger idx = [objectsArray indexOfObjectPassingTest:^(Object *object, NSUInteger idx, BOOL *stop) {
        return [object.identifier isEqualToString:myObject.identifier];
    }];

    if (idx != NSNotFound) {
        [objectsArray replaceObjectAtIndex:idx withObject:myObject];
    } else {
        [objectsArray addObject:myObject];    
    }
}

它假定
objectsArray
只包含
Object
s.

1)我很惊讶这段代码没有崩溃,因为您在修改可变数组时使用了快速枚举。2) 这段代码效率很低。为什么要使用快速枚举和
索引对象:
?或者使用普通的
for
循环,这样您就已经知道匹配对象的索引,或者使用
EnumerateObjectsSusingBlock:
来获得两者的好处。感谢您的输入,我认为它不会崩溃,因为在数组变异之后,循环继续进行另一次迭代之前,return语句会破坏循环。但是我也会尝试你的方法。当调用
replaceObjectAtIndex:
时,你如何确定数组没有正确更新?我在前后添加断点,允许我检查myObject以及objectsArray的内容。我怀疑代码工作正常,问题在于你确定它是正确的它不起作用了。我建议为您的
对象
类编写一个适当的
描述
方法,以便它显示足够的信息来清楚区分每个实例,然后在调用
addOrUpdateGroup:
前后记录
objectsArray
。然后确保日志输出中存在差异。或者问题仅仅在于
existingObject
myObject
实际上是同一个对象实例,或者它们具有相同的数据。感谢更有效的解决方案,我没有意识到这种方法。但是,错误仍然存在-新对象既没有被替换也没有被添加。显然,问题在于replaceObjectAtIndex方法调用。