【问题标题】:Checking if an array contains a certain object (iOS)检查数组是否包含某个对象(iOS)
【发布时间】:2013-01-16 19:15:12
【问题描述】:

我需要检查某个数组是否包含某个对象,如果包含,则删除该对象。如果它没有那个对象,函数应该把它添加到数组中。问题是对象总是被添加,因为检查语句总是返回 false。

这是我当前的功能:

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

    if (![myMutableArray containsObject:parameter]) {

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

    } else {

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

    }
}

【问题讨论】:

  • 我怀疑您遇到的问题与此问题中解决的问题相同:stackoverflow.com/questions/2941596/…
  • 数组是纯粹的NSString对象数组吗?
  • 您的代码适用于 2 个不同的数组:myMutableArraymyMutbaleArray。如果它是您的实际代码,那将解释问题。
  • @iosdevrocks:最好将实际代码复制/粘贴到问题中,而不是重新输入。
  • 您是否验证过 myMutableArray 已分配+初始化? (见 mprivat 的回答。)

标签: ios objective-c arrays nsmutablearray


【解决方案1】:

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

我猜你正在尝试检查对象的值,但 containsObject 实际上是调用 isEqual 来比较对象的引用,而不是它的实际值。

【讨论】:

    【解决方案2】:
    if (![arrList containsObject:arrObj]) {
        // do something
    }
    

    containsObject:

    【讨论】:

      【解决方案3】:

      首先您需要检查您在此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 类型,那么你需要转换。

      【讨论】:

        【解决方案4】:

        您应该在自定义类中实现isEqual:。默认情况下,两个对象只有在共享相同引用时才相同。

        还要确保在使用可变数组之前对其进行初始化。

        编辑

        您的数组的变量名似乎很可能打错了。

        • myMutableArray
        • myMutbaleArray

        【讨论】:

        • 不是自定义类,是NSString
        【解决方案5】:

        您可能忘记初始化您的NSMutableArray。如果未初始化,您将向 nil 对象发送 addObject 消息,这没有任何效果,并且该数组永远不会包含您之前添加的内容...

        当然,如果数组是nil,那么contains检查将始终返回false。根据 Objective-C 文档:

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

        0 为假

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-04-02
          • 2020-08-11
          • 1970-01-01
          • 2014-07-27
          • 2015-01-22
          • 2020-06-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多