【问题标题】:Checking if array contains two objects检查数组是否包含两个对象
【发布时间】:2015-01-22 13:46:19
【问题描述】:

我正在尝试实现 containsObject 但有两个参数,这可能吗?

目前我有:

if ([ myArray containsObject:@"Object1", @"Object2"]){
    return result;
} else {
    return NO;
}

显然有太多的争论。我已经深入研究了 Apple 的文档,但我还没有找到任何东西。有什么建议?

【问题讨论】:

  • containsObject 只接受一个参数。使用 && 运算符。

标签: ios objective-c nsarray foundation


【解决方案1】:

为什么不这样做呢?

if ([ myArray containsObject:@"Object1" ] && [ myArray containsObject:@"Object 2" ] ){
    return result;
} else {
    return NO;
}

【讨论】:

    【解决方案2】:

    是太多参数了, containsObject 是针对单个对象的。 (您可以阅读其官方文档here)要解决您的问题,请使用&& 运算符并分别在每个对象上调用 containsObject。

    if ([myArray containsObject:@"Object1"] && [myArray containsObject@"Object2"]){
        return result;
    } else {
    return NO;
    }
    

    【讨论】:

      【解决方案3】:

      您必须单独评估它们。示例:

      bool MONNSArrayContainsAllObjectsIn(NSArray* const pArray, NSArray* const pSought) {
       assert(pArray);
       assert(pSought);
       assert(0 < pSought.count);
      
       for (id at in pSought) {
        if (false == [pArray containsObject:at]) {
         return false;
        }
       }
       return true;
      }
      

      那么你上面的代码就变成了:

      return MONNSArrayContainsAllObjectsIn(myArray, @[@"Object1", @"Object2"]);
      

      如果您正在使用已知数量的元素(在本例中为 2 个),那么您可以避免创建临时数组 - 如果您更愿意进行优化并写出您需要的所有变体,包括参数。其他答案详细说明了这种方法。

      如果您有大型数组和许多比较要执行,NSSet 可能更适合您的任务。

      【讨论】:

      • 起初这似乎不必要地复杂,但设计一种更抽象/更灵活的带有错误检查的方法是有意义的。你能解释一下const 的目的/好处吗?如果它们是不可变的 NSArray,为什么需要 const?
      • 使用可变参数也可以避免创建一个临时的NSArray。
      • @mc01 此示例中的 const 适用于指针,而不是对象。 const ObjC 对象在实践中并不是很有用。将 const 应用于指针只是声明指针的值可能不会改变。这与对象的 const 的存在/不存在无关。就像 const-introduction 的许多用途一样,它不是必需的,而是一种帮助开发人员的意图(主观的)。 const 指针禁止的操作示例:++pArray、--pArray、pArray = nil、pArray += 2、pArray = 0、pArray = pSought。
      • @JoshCaswell 绝对 +1。但是,我会在我的回答中推荐这种方法而不是可变参数,因为它更安全。
      • @mc01 不客气。 pArray = someOtherObj 是 const 禁止的例子。然而,*pArray = *someOtherPointer 实际上是对被引用对象的赋值。 ObjC 类型的编译器禁止此赋值,但对于 C 类型(例如 int*、float*、struct*)是完全合法的。在这种情况下,const 不是对编译器有用的信息——它对程序员很有用,如果指针被重新分配(或以其他方式发生突变),编译器将发出错误。很可能,程序员并不打算修改参数。 (续)
      猜你喜欢
      • 1970-01-01
      • 2020-06-07
      • 1970-01-01
      • 2011-04-02
      • 2020-08-11
      • 1970-01-01
      • 2020-08-09
      • 1970-01-01
      • 2021-03-09
      相关资源
      最近更新 更多