gpt4 book ai didi

objective-c - 比较 objective-c 中的数组

转载 作者:太空狗 更新时间:2023-10-30 03:20:52 26 4
gpt4 key购买 nike

好吧,这是一个非常简单的问题。在 C++ 中它似乎可以工作,但在 Objective-C 中我似乎很难解决 :S ..如果你想比较两个数组应该是这样的吧

for ( int i = 0; i < [appdelegate.nicearray count]; i++ ) 
{
if ( appdelegate.nicearray[i] == appdelegate.exercarray[i] )
{
NSLog(@"the same elements in this selection");
}
}

到底是什么问题?

最佳答案

这些是 Cocoa 数组对象(NSArray 的实例),不是 C 数组或 C++ 向量,请记住 Objective-C 没有运算符重载。您可以对对象做的唯一事情就是传递它、将它存储在变量中以及向它发送消息。

所以数组下标运算符对于 Objective-C 对象是错误的。我不认为取消引用指向 Objective-C 对象的指针在语言上是有效的,所以这段代码应该会给你一个编译器错误。不过,我可能记错了。如果它确实进入运行时,该代码迟早会崩溃,因为您正在访问数组对象末尾之外的内存。

(从 2013 年开始编辑:Objective-C 现在支持对象下标。这最终转化为适当的 objectAtIndex:replaceObjectAtIndex:withObject: 消息。所以,问题中的代码现在实际上可以工作了,尽管它仍然不是简单遍历数组的正确方法,更不用说比较两个数组了。)

通过索引从 NSArray 对象中检索对象的正确方法不是使用数组下标运算符,而是向数组对象发送 objectAtIndex: 消息:

[myArray objectAtIndex:i]

迭代数组对象元素的正确方法,假设你真的不需要其他东西的索引(例如替换可变数组中的对象),是直接循环它(这称为“快速枚举”):

for (MyObject *myObject in myArray) {

}

NSArray 还响应 objectEnumeratorreverseObjectEnumerator,它们返回一个类似的可迭代对象。在这两者中,reverseObjectEnumerator 在新代码中更有用,因为您可以直接迭代数组以向前迭代。在快速枚举存在之前,它们都是最有用的;该代码如下所示:

NSEnumerator *myArrayEnum = [myArray objectEnumerator];
MyObject *myObject;
while ((myObject = [myArrayEnum nextObject])) {

}

(是的,这是条件中的赋值。故意的,因此有额外的 ()。我们当时大胆地编码,不是吗?)

不过,对于您正在做的事情,您更有可能希望向其中一个数组发送 isEqualToArray: 消息,正如 Williham Totland 所建议的:

BOOL theyAreEqual = [myFirstArray isEqualToArray:mySecondArray];

这将确保两个数组具有相同的长度,然后以锁步方式遍历它们,将 isEqual: 发送到每对对象。如果每个 isEqual: 消息都返回 YES,它将返回 YESNO 否则。数组可能包含不同的对象,但只要每一对相等,数组本身就相等。

假设您想要对象相等。当您向它发送 isEqual: 消息并传递另一个对象时,如果其中一个对象以 YES 响应,则两个单独的对象相等。如果您打算比较对象的身份,那么您需要自己执行锁步循环并使用 ==:

BOOL arraysContainTheSameObjects = YES;
NSEnumerator *otherEnum = [otherArray objectEnumerator];
for (MyObject *myObject in myArray) {
if (myObject != [otherEnum nextObject]) {
//We have found a pair of two different objects.
arraysContainTheSameObjects = NO;
break;
}
}

但这不太可能。大多数时候,我想测试对象的相等性,而不是同一性,所以 isEqualToArray: 就是我想要的。

关于objective-c - 比较 objective-c 中的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1137839/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com