2011-01-15 9 views

Respuesta

35
BOOL found=NO; 
for (NSString *s in arrayOfStrings) 
{ 
    if ([stringToSearchWithin rangeOfString:s].location != NSNotFound) { 
    found = YES; 
    break; 
    } 
} 
+0

Eso funcionó. ¡Gracias! – Josh

13

puede ser un tonto para su optimización caso de uso, pero dependiendo del tamaño de la matriz es que usted está iterando, puede ser útil/con más prestaciones para usar NSArray'sindexOfObjectWithOptions:passingTest: método.

Con este método, pasa algunas opciones y un bloque que contiene su prueba. Al pasar la opción NSEnumerationConcurrent, la evaluación de su bloque se puede realizar en varios subprocesos al mismo tiempo y puede acelerar las cosas. Reutilicé la prueba de invariante, pero de una manera ligeramente diferente. El bloque devuelve funcionalmente un BOOL similar a la variable "found" en la implementación del invariante. El "* stop = SÍ;" La línea indica que la iteración debe detenerse.

Consulte la documentación de referencia de NSArray para obtener más información. Reference

NSArray *arrayOfStrings = ...; 
NSString *stringToSearchWithin = ..."; 
NSUInteger index = [arrayOfStrings indexOfObjectWithOptions:NSEnumerationConcurrent 
               passingTest:^(id obj, NSUInteger idx, BOOL *stop) 
        { 
         NSString *s = (NSString *)obj; 
         if ([stringToSearchWithin rangeOfString:s].location != NSNotFound) { 
          *stop = YES; 
          return YES; 
         } 
         return NO; 
        }]; 
if (arrayOfStrings == nil || index == NSNotFound) 
{ 
    NSLog(@"The string does not contain any of the strings from the arrayOfStrings"); 
    return; 
} 
NSLog(@"The string contains '%@' from the arrayOfStrings", [arrayOfStrings objectAtIndex:index]); 
+0

Gracias Adam! ¡Pieza de código muy útil, funciona maravillosamente! – FreeAppl3

4

muy pequeña mejora la seguridad en la respuesta de Adán: hay un gran problema con "objectAtIndex:" porque no es totalmente seguro para subprocesos y hará que su aplicación accidente con demasiada frecuencia. Así que hago:

NSArray *arrayOfStrings = ...; 
NSString *stringToSearchWithin = ..."; 
__block NSString *result = nil; 
[arrayOfStrings indexOfObjectWithOptions:NSEnumerationConcurrent 
          passingTest:^(NSString *obj, NSUInteger idx, BOOL *stop) 
    { 
     if ([stringToSearchWithin rangeOfString:obj].location != NSNotFound) 
     { 
      result = obj; 
      *stop = YES; 
      //return YES; 
     } 
     return NO; 
    }]; 
if (!result) 
    NSLog(@"The string does not contain any of the strings from the arrayOfStrings"); 
else 
    NSLog(@"The string contains '%@' from the arrayOfStrings", result); 
4
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF IN %@", theArray]; 
BOOL result = [predicate evaluateWithObject:theString]; 
0

Al igual que con la liberación de iOS8, Apple ha añadido un nuevo método para NSString llamada localizedCaseInsensitiveContainsString. Esto hará exactamente lo que quiera más fácil:

BOOL found = NO; 
NSString *string = @"ToSearchFor"; 
for (NSString *s in arrayOfStrings){ 
    if ([string localizedCaseInsensitiveContainsString:s]) { 
     found = YES; 
     break; 
    } 
} 
Cuestiones relacionadas