En Objective-C, compruebe una matriz de valores booleans y vea si al less UNO es SÍ

Tengo una matriz mutable de valores booleans y quiero verificar si CUALQUIERA de los valores es SÍ.

Actualmente estoy creando otra matriz junto a ésta que siempre es TODO Falso como tal;

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

El usuario hace algunos bits y algunos de los objects en MyArray pueden convertirse en SÍ, luego utilizo el siguiente para ver si ALGUNO es verdadero o no.

 if([MyArray isEqualToArray:MyAllNoArray]) 

Me pregunto si hay una mejor manera (de esta manera parece un desperdicio)?

He pensado en un contador, cada vez que uno de los objects cambia el contador sube o baja (dependiendo de cambiar a SÍ o NO), si el contador es 0, entonces también lo es la matriz. Pero estoy pensando que puede haber una mejor forma dentro de una statement de IF que me falta.

Creo que una solución más simple sería esta:

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

Los loops y los bloques serían una exageración si solo necesitas comprobar su presencia.

 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."); 

O conviértalo en un método:

 - (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; } 

O … no he probado esto todavía, pero creo que debería funcionar:

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

La forma más fácil es usar containsObject:@(YES) .

Explicación

Si revisa la documentation de NSArray, dice

containsObject: Devuelve un valor boolean que indica si un object determinado está presente en la matriz.

  • (BOOL) containsObject: (id) anObject

Discusión

Este método determina si anObject está presente en la matriz enviando un post isEqual: a cada uno de los objects de la matriz (y pasando un object como parámetro a cada isEqual: message).

So containsObject:@(YES) debería hacer el truco

Casi la misma respuesta que random, pero sin lockings.

 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; } } 

No puedes hacer mucho (*) mejor que eso para una testing sin algún tipo de "puntaje", aunque tu esquema de contador es sin duda mejor, si eliges "mantener puntaje".

(*) Es discutible si usar isEqualToNumber es más o less eficiente que simplemente probar boolValue .

Muchas buenas respuestas aquí, y la sugerencia de @Arcanfel y @rr1g0 de simplemente usar containsObject: es realmente elegante y simple.

Los muchos colegas estimados que han respondido al hilo han omitido una opción importante, sin embargo, una solución basada en pnetworkingicados. Entonces, aquí va, en interés de lo completo:

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

La idea aquí es que la subconsulta construye una matriz de objects que son iguales a @(YES) , entonces tomamos el recuento de eso, y si es positiva, sabemos que hay al less un verdadero valor boolean en la matriz.

Este enfoque, obviamente, se puede extender a otros types de numbers para determinar si hay al less un número negativo en una matriz, por ejemplo.