Так что лично я действительно ненавижу NSNotFound
, но понимаю его необходимость.
Но некоторые люди могут не понимать сложности сравнения с NSNotFound
Например, этот код:
- (BOOL)doesString:(NSString*)string containString:(NSString*)otherString {
if([string rangeOfString:otherString].location != NSNotFound)
return YES;
else
return NO;
}
имеет свои проблемы:
1) Очевидно, если otherString = nil
этот код завершится сбоем. простой тест будет:
NSLog(@"does string contain string - %@", [self doesString:@"hey" containString:nil] ? @"YES": @"NO");
результат в !! CRASH !!
2) Для новичка в объективе-c не так очевидно, что тот же код НЕ вылетит при string = nil
.
Например, этот код:
NSLog(@"does string contain string - %@", [self doesString:nil containString:@"hey"] ? @"YES": @"NO");
и этот код:
NSLog(@"does string contain string - %@", [self doesString:nil containString:nil] ? @"YES": @"NO");
приведет к
does string contains string - YES
Что явно НЕ то, что вы хотите.
Таким образом, лучшее решение, которое я считаю работающим, состоит в том, чтобы использовать тот факт, что rangeOfString возвращает длину 0, так что лучший, более надежный код выглядит так:
- (BOOL)doesString:(NSString*)string containString:(NSString*)otherString {
if(otherString && [string rangeOfString:otherString].length)
return YES;
else
return NO;
}
ИЛИ ПРОСТО:
- (BOOL)doesString:(NSString*)string containString:(NSString*)otherString {
return (otherString && [string rangeOfString:otherString].length);
}
, который для случаев 1 и 2 вернется
does string contains string - NO
Это мои 2 цента; -)
Пожалуйста, проверьте мой Gist для более полезного кода.