Donc personnellement je déteste vraiment NSNotFound
mais comprends sa nécessité.
Mais certaines personnes peuvent ne pas comprendre la complexité de la comparaison avec NSNotFound
Par exemple, ce code:
- (BOOL)doesString:(NSString*)string containString:(NSString*)otherString {
if([string rangeOfString:otherString].location != NSNotFound)
return YES;
else
return NO;
}
a ses problèmes:
1) Évidemment, si otherString = nil
ce code se bloque. un test simple serait:
NSLog(@"does string contain string - %@", [self doesString:@"hey" containString:nil] ? @"YES": @"NO");
résulte en !! CRASH !!
2) Ce qui n'est pas si évident pour quelqu'un de nouveau à objective-c, c'est que le même code ne plantera PAS quand string = nil
. Par exemple, ce code:
NSLog(@"does string contain string - %@", [self doesString:nil containString:@"hey"] ? @"YES": @"NO");
et ce code:
NSLog(@"does string contain string - %@", [self doesString:nil containString:nil] ? @"YES": @"NO");
entraînera à la fois
does string contains string - YES
Ce qui n'est clairement pas ce que vous voulez.
Donc, la meilleure solution qui, selon moi, fonctionne est d'utiliser le fait que rangeOfString renvoie la longueur de 0, alors un code plus fiable est le suivant:
- (BOOL)doesString:(NSString*)string containString:(NSString*)otherString {
if(otherString && [string rangeOfString:otherString].length)
return YES;
else
return NO;
}
OU SIMPLEMENT:
- (BOOL)doesString:(NSString*)string containString:(NSString*)otherString {
return (otherString && [string rangeOfString:otherString].length);
}
qui reviendra pour les cas 1 et 2
does string contains string - NO
C'est mes 2 cents ;-)
Veuillez consulter mon Gist pour un code plus utile.