Então, pessoalmente, eu realmente odeio, NSNotFound
mas entendo sua necessidade.
Mas algumas pessoas podem não entender as complexidades da comparação com o NSNotFound
Por exemplo, este código:
- (BOOL)doesString:(NSString*)string containString:(NSString*)otherString {
if([string rangeOfString:otherString].location != NSNotFound)
return YES;
else
return NO;
}
tem seus problemas:
1) Obviamente, se otherString = nil
este código falhar. um teste simples seria:
NSLog(@"does string contain string - %@", [self doesString:@"hey" containString:nil] ? @"YES": @"NO");
resulta em !! BATIDA !!
2) O que não é tão óbvio para alguém novo no objetivo-c é que o mesmo código NÃO trava quando string = nil
. Por exemplo, este código:
NSLog(@"does string contain string - %@", [self doesString:nil containString:@"hey"] ? @"YES": @"NO");
e este código:
NSLog(@"does string contain string - %@", [self doesString:nil containString:nil] ? @"YES": @"NO");
ambos resultarão em
does string contains string - YES
O que claramente não é o que você deseja.
Portanto, a melhor solução que eu acredito que funciona é usar o fato de rangeOfString retornar o comprimento 0, então um código melhor e mais confiável é o seguinte:
- (BOOL)doesString:(NSString*)string containString:(NSString*)otherString {
if(otherString && [string rangeOfString:otherString].length)
return YES;
else
return NO;
}
OU SIMPLESMENTE:
- (BOOL)doesString:(NSString*)string containString:(NSString*)otherString {
return (otherString && [string rangeOfString:otherString].length);
}
que retornará para os casos 1 e 2
does string contains string - NO
Esses são meus 2 centavos ;-)
Verifique meu Gist para obter mais códigos úteis.