检查数组是否包含某个对象(iOS)

22
我需要检查一个特定数组是否包含某个对象,如果是,则删除该对象。如果没有这个对象,函数应该将其添加到数组中。问题在于,由于检查语句总是返回false,所以该对象始终被添加。
这是我的当前函数:
- (void) myFunction:(NSString *)parameter {

    if (![myMutableArray containsObject:parameter]) {

        [myMutableArray addObject:parameter];
        NSLog(@"%@ added", parameter);

    } else {

        [myMutableArray removeObject:parameter];
        NSLog(@"%@ deleted", parameter);

    }
}

1
我怀疑你遇到的问题与这个问题的解决方案相同:https://dev59.com/nXA85IYBdhLWcg3wF_m0 - Paul O.
这可能意味着你的原始字符串和新字符串在某种程度上是不同的——大小写、空格等。 - Hot Licks
1
你的代码使用了两个不同的数组:myMutableArraymyMutbaleArray。如果这是你实际的代码,那么这就可以解释问题所在了。 - Martin R
1
@iosdevrocks:将实际代码复制/粘贴到问题中总是更好,而不是重新输入。 - Martin R
1
你确认了myMutableArray是否已分配和初始化?(请参考mprivat的回答。) - Martin R
显示剩余10条评论
5个回答

34

containsObject在数组中遍历每个对象时会调用isEqual方法。您要检查的对象类型是什么?如果它是自定义对象,则应重写并实现isEqual方法。

我猜您想要检查对象的值,但是containsObject实际上调用了isEqual,比较的是对象的引用而不是其实际值。


21

7

首先,您需要检查您正在向myMutableArray中添加哪种类型的数据或对象。根据您的方法,您正在检查可变数组中传递的字符串类型参数parameter。可能存在包含int或float数组的情况。

您的数组可能存在类型转换问题。如果您的数据是STRING类型,则可以使用另一种方法,如下所示。

- (void) myFunction:(NSString *)parameter {

for (int i = 0 ; i < [myMutableArray count ] ; i++) {


    if (![[myMutableArray objectAtIndex:i] isEqualToString:parameter]) {
        [myMutableArray addObject:parameter];
        NSLog(@"%@ added", parameter);
    }
    else{
        [myMutableArray removeObject:parameter];
        NSLog(@"%@ deleted", parameter);
    }
}

希望这能帮到您。如果您的对象不是NSString类型,则需要进行转换。

2

您应该在自定义类中实现isEqual:方法。默认情况下,只有当两个对象引用相同时它们才是相同的。

同时,在使用可变数组之前,请确保先进行初始化。

编辑

看起来您的数组变量名可能被误拼写了。

  • myMutableArray
  • myMutbaleArray

它不是自定义类,而是一个NSString。 - mprivat

1
你可能忘记初始化你的NSMutableArray。如果没有初始化,你会向一个nil对象发送addObject消息,这没有任何效果,数组永远不会包含你之前添加的内容...
当然,如果数组是nil,那么contains检查将始终返回false。根据Objective-C文档:

如果该方法返回一个对象、任何指针类型、任何整数标量大小小于或等于sizeof(void*)、一个float、一个double、一个long double或一个long long,则发送给nil的消息返回0。

而0就是false。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接