在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)
的对象数组,然后我们计算它的数量,如果它是正数,我们知道数组中至少有一个真正的布尔值。
这种方法显然可以扩展到其他类型的数字 – 例如,确定数组中是否至少有一个负数。