【问题标题】:Objective-C - How to get sum of Boleans?Objective-C - 如何获得布尔值的总和?
【发布时间】:2014-04-09 05:12:33
【问题描述】:

通过下面的代码,我可以获得如下输出:
0
1
1

我想要的是输出这些布尔值的总和,在我的情况下,结果将是:
2 因为我们有0+1+1

代码[更新]:

  -(void)markers{
        CLLocationCoordinate2D tg = CLLocationCoordinate2DMake(location.latitude, location.longitude);
        GMSCoordinateBounds *test = [[GMSCoordinateBounds alloc]initWithPath:path];
        BOOL test3 = [test containsCoordinate:tg];
        {
            if (test3 == 1)
            {
  marker.position = CLLocationCoordinate2DMake(location.latitude, location.longitude);                     
            }else if (test3 == 0)
            {
  marker.position = CLLocationCoordinate2DMake(0, 0);
            }
        }
    }       
}

【问题讨论】:

  • 我只看到一个 BOOL。另外两个在哪里?
  • 你真正想做的(我认为)是 count 有多少 BOOL 是 YES(不是它们的“总和”)。
  • 如果您追求的是整体布尔值(例如,对所有 BOOL 进行逻辑与运算),您可以简单地将它们相乘,记住将任何负值增加到零 (0)。负数 (BOOL false 0) 这将 not 是你想要的(即乘以 2x false BOOLS 将导致“真”,这是错误的)。

标签: ios objective-c arrays boolean


【解决方案1】:

另一种方法是假设如果任何一个值为假,则整个数组为假,因此,循环遍历数组直到找到假值,然后中断:

BOOL retval = true;  //return holder variable

/*'boolsNumArray' is an NSArray of NSNumber instances, converted from BOOLs:

    //BOOL-to-NSNumber conversion (makes 'boolsNumArray' NSArray, below)!
    '[myNSArray addObject:[NSNumber numberWithBool:yourNextBOOL]]' 

*/
for(NSNumber* nextNum in boolsNumArray) {
    if([nextNum boolValue] == false) {
        retval = false;
        break;
    }
}

return retval;

【讨论】:

    【解决方案2】:

    而不是 sum BOOLs,这是违反直觉的,循环遍历你用来获取 BOOL 值的任何内容,如果你得到 YES,则增加一个计数器。这将是您拥有的“是”数。

    如果您有一个 BOOL 数组,您可以使用谓词过滤数组以获得 YES 值,结果数组的长度就是您拥有的 YES 数。

    已编辑以在 OP cmets 之后添加代码示例

    增加一个计数器

    NSUInteger numberOfBools = 0;
    CLLocationCoordinate2D tg = CLLocationCoordinate2DMake(location.latitude, location.longitude);
    GMSCoordinateBounds *test = [[GMSCoordinateBounds alloc]initWithPath:path];
    if ([test containsCoordinate:tg1]) { ++numberOfBools; }
    if ([test containsCoordinate:tg2]) { ++numberOfBools: }
    ... // other tests here;
    
    // numberOfBools now contains the number of passing tests.
    

    在添加完整代码后再次编辑

    // snipped code above here
    // This is where you add the counter and initialise it to 0
    NSUInteger numberOfBools = 0;
    for (NSDictionary *dictionary in array)
    {            
        // Snip more code to this point
        BOOL test3 = [test containsCoordinate:tg];
        {
            if (test3)
            {
            // This is where you increment the counter
            ++numberOfBools;
    
    // Snip more code to the end of the for block
    }
    
    // Now numberOfBools shows how many things passed test3
    

    【讨论】:

    • 第二种方法很可能会很慢,但是与您的第一种计数方法相比。
    • 取决于您何时/何地获得 BOOL。一个简单的循环和计数就可以了。但是,如果您必须做很多事情,可能创建一个静态谓词来遍历列表会更快。 IIRC,创建谓词是昂贵的一点,它们运行速度很快。
    • @Abizern,能否请您提供一个代码sn-p,这样我可以有一个更清晰的想法,还是谢谢你!
    • @user3340961 当你的代码只显示一个测试时,很难给你一个代码sn-p。
    • @Abizern - 不是真的,在这种情况下,您所说的是数组将被调整大小,然后大小就是答案。数组调整大小的问题在于它本身就是一个昂贵的操作。我看到并将进一步查看您的 IIRC,也许它们的实施方式不同:-)
    【解决方案3】:

    可以只添加 BOOL,因为 bool 只是整数。例如:

    int sum = 0;
    
    CLLocationCoordinate2D tg = CLLocationCoordinate2DMake(location.latitude, location.longitude);
    GMSCoordinateBounds *test = [[GMSCoordinateBounds alloc]initWithPath:path];
    BOOL test3 = [test containsCoordinate:tg];
    //Obtain bolean values :
    
    BOOL testX = /* other test */;
    BOOL testY = /* other test */;
    
    sum = test3 + testX + testY
    

    然而,这是一个坏主意,因为 BOOL 不一定是 10。他们是0not 0

    BOOL 只是一个类型定义的字符:typedef signed char BOOL; YESNO 是 1 和 0,但 BOOL variable = 2 完全有效

    例如:

    - (int) testX
    {
        if(inState1) return 1;
        if(inState2) return 2;
    
        else return 0;
    }
    
    BOOL textXResult = [self testX]; //Might return 2, this is still equivalent to YES.
    

    最好的解决方案是迭代您的 BOOL,而是计算 YES 的数量。

    【讨论】:

    • (Objective-C 类型)BOOLnot 0 或非 0。它是 NO (==0) 或 YES (==1 )。这是定义的。无论如何,由于不同的原因,它仍然是一个坏主意:BOOL 被实现为整数,但这没有定义。因此,根据通常的 C 规则,BOOL 对象与 BOOL 对象之和是 BOOL 对象,并且如果两个 BOOL 对象都是 YES (==1),则将具有无效值。
    • 你误解了我写的内容。 is zero 的任何 BOOL 为 NO/false,not zero 的 BOOL 为 YES/true。
    • 你可以写 BOOL test3 = [test containsCoordinate:tg]!=0;确保它是 0 或 1。但我认为在 BOOL 中存储不同于 0 或 1 的值是一个逻辑错误,即使它是语言允许的。
    • @James Webster 不,我没有误解这一点。如果 BOOL 对象不为零,则它等于 YES 是不正确的。 Objective-C 的 BOOL 不是 C 的 _Bool。
    • 我为我的书尝试了数百万次。我没有错。你试过了吗? BOOL a = 2; NSLog(@"%d", a); NSLog(@"%d", a==YES); 输出 2 和 0。这只适用于 C 的 _Bool
    【解决方案4】:
    int sum = (test3 ? 1 : 0) + (testX ? 1 : 0) + (testY ? 1 : 0);
    

    而且不是那么奇怪的变体:

    #define BOOL_TO_INT(val) ((val) ? 1 : 0)
    
    int sum = BOOL_TO_INT(test3) + BOOL_TO_INT(testX) + BOOL_TO_INT(testY);
    

    【讨论】:

    • 这似乎仍然是一件奇怪的事情,但至少它确保布尔值最终为零或一。
    • 我不知道这个@bdesham 有什么奇怪之处,但我完全同意你的其他评论。
    • 我正在考虑int sum = (!test3 ?: 0) + (!testX ?: 0) + (!testY ?: 0);,但我认为这很奇怪。
    • @JamesWebster 再想一想,一旦你把它放在上下文中,它可能看起来不会太奇怪:-)
    • 啊!一个#define,用火杀死它。作为静态函数可能会更好:static inline NSUInteger boolToInteger(BOOL b) { return b ? 1 : 0; }
    猜你喜欢
    • 1970-01-01
    • 2016-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-08
    相关资源
    最近更新 更多