在Objective-C中检查一个布尔值数组,看看是否至少有一个是YES

我有一个可变的布尔值数组,我想检查是否有任何值为YES。

目前我正在创建另一个arrays,这个arrays总是如此虚假;

[MyArray addObject:[NSNumber numberWithBool:switchInput]]; [MyAllNoArray addObject:[NSNumber numberWithBool:NO]]; 

用户做了一些比特,MyArray中的一些对象可能变为YES,然后我使用下面的内容来查看是否有任何真实。

 if([MyArray isEqualToArray:MyAllNoArray]) 

我只是想知道是否有更好的方法(这种方式似乎很浪费)?

我考虑过一个计数器,每当其中一个对象改变时,计数器就会上升或下降(取决于改为YES或NO),如果计数器为0则数组也是如此。 但我只是觉得在IF语句中可能有一种更好的方法,我错过了。

我认为一个更简单的解决方案是:

 NSArray *bools = @[@(NO),@(NO), @(YES)]; if ([bools containsObject:@(YES)]) { // do your magic here } 

如果你只是需要检查存在,循环和块将是一个矫枉过正。

 NSArray *myArray; __block bool hasTrue = NO; [myArray enumerateObjectsUsingBlock:^(NSNumber *num, NSUInteger idx, BOOL *stop) { if (num.boolValue) { hasTrue = YES; *stop = YES; } }]; if (hasTrue) NSLog(@"there is a true value in myArray."); else NSLog(@"there is not true value in myArray."); 

或者把它变成一个方法:

 - (BOOL)doesMyArrayHaveTrue { NSArray *myArray; __block bool hasTrue = NO; [myArray enumerateObjectsUsingBlock:^(NSNumber *num, NSUInteger idx, BOOL *stop) { if (num.boolValue) { hasTrue = YES; *stop = YES; } }]; return hasTrue; } 

或者……我还没有尝试过,但我认为它应该有效:

 NSNumber * max = [myArray valueForKeyPath:@"@max.self"]; if (max.boolValue) NSLog(@"there is a true values."); else NSLog(@"there is not a true value."); 

最简单的方法是使用containsObject:@(YES)

说明

如果你查看NSArray文档,它会说

containsObject:返回一个布尔值,指示给定对象是否存在于数组中。

  • (BOOL)containsObject:(ID)anObject

讨论

此方法通过向每个数组的对象发送isEqual:消息 (并将anObject作为参数传递给每个isEqual:消息)来确定数组中是否存在anObject。

所以containsObject:@(YES)应该做的伎俩

几乎与随机相同的答案,但没有块。

 bool allFalse = true; for(NSNumber *number in MyArray) { if([number boolValue]) { allFalse = false; break; } } if(!allFalse) { ... } 
 NSNumber* yesBool = [NSNumber numberWithBool:YES]; BOOL foundYes = NO; for (NSNumber* num in MyArray) { if ([num isEqualToNumber:yesBool) { foundYes = YES; break; } } 

如果没有某种“得分”,你不能比没有某种“得分”的测试做得更好(*),尽管如果你选择“保持得分”,你的反制方案无疑会更好。

(*)使用isEqualToNumber比简单地测试boolValue更有效还是更低效是boolValue

这里有很多好的答案,@ Arcanfel和@ rr1g0建议只使用containsObject:非常优雅和简单。

尽管如此,许多受人尊敬的同事已经回答了这个问题,但却提出了一个重要的选择 – 一个基于谓词的解决方案。 所以这里是为了完整性:

 NSArray *data = @[@(NO), @(YES), @(NO)]; NSPredicate *hasYesPred = [NSPredicate predicateWithFormat: @"SUBQUERY(SELF, $s, $s == %@).@count > 0", @(YES)]; BOOL hasYes = [hasYesPred evaluateWithObject: data]; 

这里的想法是子查询构造一个等于@(YES)的对象数组,然后我们计算它的数量,如果它是正数,我们知道数组中至少有一个真正的布尔值。

这种方法显然可以扩展到其他类型的数字 – 例如,确定数组中是否至少有一个负数。