Personalmente, realmente odio NSNotFound
pero entiendo su necesidad.
Pero algunas personas pueden no entender las complejidades de comparar contra NSNotFound
Por ejemplo, este código:
- (BOOL)doesString:(NSString*)string containString:(NSString*)otherString {
if([string rangeOfString:otherString].location != NSNotFound)
return YES;
else
return NO;
}
tiene sus problemas:
1) Obviamente si otherString = nil
este código fallará. una prueba simple sería:
NSLog(@"does string contain string - %@", [self doesString:@"hey" containString:nil] ? @"YES": @"NO");
resultados en !! CRASH !!
2) Lo que no es tan obvio para alguien nuevo en el objetivo-c es que el mismo código NO se bloqueará cuando string = nil
. Por ejemplo, este código:
NSLog(@"does string contain string - %@", [self doesString:nil containString:@"hey"] ? @"YES": @"NO");
y este código:
NSLog(@"does string contain string - %@", [self doesString:nil containString:nil] ? @"YES": @"NO");
ambos resultarán en
does string contains string - YES
Que claramente NO es lo que quieres.
Entonces, la mejor solución que creo que funciona es usar el hecho de que rangeOfString devuelve la longitud de 0, por lo que un código mejor y más confiable es este:
- (BOOL)doesString:(NSString*)string containString:(NSString*)otherString {
if(otherString && [string rangeOfString:otherString].length)
return YES;
else
return NO;
}
O SIMPLEMENTE:
- (BOOL)doesString:(NSString*)string containString:(NSString*)otherString {
return (otherString && [string rangeOfString:otherString].length);
}
que para los casos 1 y 2 volverá
does string contains string - NO
Esos son mis 2 centavos ;-)
Consulte mi Gist para obtener más código útil.