【问题标题】:Using valueForKeyPath on an NSArray, how to count a BOOL property if property is set to YES在 NSArray 上使用 valueForKeyPath,如果属性设置为 YES,如何计算 BOOL 属性
【发布时间】:2013-11-01 08:37:31
【问题描述】:

我有一个名为 allQuestions 的 NSArray,其中的对象具有一个名为 isCorrect 的 BOOL 属性

我试过了

int res = [self.allQuestions valueForKeyPath:@"@sum.isCorrect"];

但这总是给我一个假号码。我虽然 YES 算作 1,而 NO 算作 0。我在这里错过了什么。没有价值保证吗?如果不是,那么在不迭代数组的情况下实现这个简单事情的最佳方法是什么?

编辑:确切地说:我对评估为 YES 的元素的计数(数量)感兴趣。

【问题讨论】:

  • 该行至少会导致编译器警告。
  • 已解决,@sum 似乎有效,但返回 NSNumber。事后看来:明显

标签: objective-c cocoa


【解决方案1】:
int res = [[self.allQuestions valueForKeyPath:@"@sum.isCorrect"] intValue];

valueForKeyPath 返回 NSNumber 的对象。您需要将其转换为原始类型 int 或在 NSNumber 处使用指针。

【讨论】:

    【解决方案2】:

    添加到数组时,您应该将布尔值包装在 NSNumber 中:

    BOOL b = YES;
    
    [self.allQuestions addObject:[NSNumber numberWithBool:b]]; 
    

    并以同样的方式检索:

     BOOL b = [[self.allQuestions valueForKeyPath:@"@sum.isCorrect"] boolValue];
    

    【讨论】:

    • 我在问题的标题中说明:“如何计算”,即我想知道一个数字,比如 55 [问题是正确的]
    • 您在我编辑答案后编辑了问题。只需使用 for 循环来解析所有数组项,只要你得到 bool YES(使用我上面写的代码),就会生成一个整数 +1。我认为这很简单。
    • 这是一种显而易见的做法,我同意,但我很好奇为什么我的建议不起作用,它显然调用了所有 isCorrect 属性,因为当它执行时我可以看到它,但是然后呢?总结了指针?而且似乎几乎没有关于关键路径一般如何工作以及它们提供什么的文档......我在这里使用了一个简单的例子,但考虑到了更大的事情;我喜欢 LINQ 之类的东西,我认为我可以对基本的东西使用关键路径来保持代码更简洁,但是唉......
    • 因为 res 是一个 Int 并且 Bool 值应该在 NSArrays 中保存为 NSNumber。
    【解决方案3】:

    已解决:

        NSNumber * res = [self.allQuestions valueForKeyPath:@"@sum.isCorrect"];
    

    它返回一个 NSNumber,当然...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-17
      • 2021-09-15
      • 2021-07-09
      • 1970-01-01
      • 2014-08-30
      • 2016-04-15
      • 1970-01-01
      相关资源
      最近更新 更多