Тож особисто я дуже ненавиджу, 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");
призводить до !! КРИШ !!
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 копійки ;-)
Будь ласка, ознайомтеся з моїм істотним документом, щоб отримати корисніший код