Так что лично я очень ненавижу, 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) Что не так очевидно для кого-то новичка в Objective-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 для более полезного кода.