Więc osobiście naprawdę nienawidzę, NSNotFound
ale rozumiem jego konieczność.
Ale niektórzy ludzie mogą nie rozumieć złożoności porównywania z NSNotFound
Na przykład ten kod:
- (BOOL)doesString:(NSString*)string containString:(NSString*)otherString {
if([string rangeOfString:otherString].location != NSNotFound)
return YES;
else
return NO;
}
ma swoje problemy:
1) Oczywiście, jeśli otherString = nil
ten kod ulegnie awarii. prosty test to:
NSLog(@"does string contain string - %@", [self doesString:@"hey" containString:nil] ? @"YES": @"NO");
prowadzi do !! CRASH !!
2) Dla kogoś nowego w celu-c nie jest to tak oczywiste, że ten sam kod NIE ulega awarii, gdy string = nil
. Na przykład ten kod:
NSLog(@"does string contain string - %@", [self doesString:nil containString:@"hey"] ? @"YES": @"NO");
i ten kod:
NSLog(@"does string contain string - %@", [self doesString:nil containString:nil] ? @"YES": @"NO");
spowoduje oba
does string contains string - YES
Które wyraźnie NIE jest tym, czego chcesz.
Lepszym rozwiązaniem, które moim zdaniem działa, jest wykorzystanie faktu, że rangeOfString zwraca długość 0, więc lepszym, bardziej niezawodnym kodem jest:
- (BOOL)doesString:(NSString*)string containString:(NSString*)otherString {
if(otherString && [string rangeOfString:otherString].length)
return YES;
else
return NO;
}
LUB PO PROSTU:
- (BOOL)doesString:(NSString*)string containString:(NSString*)otherString {
return (otherString && [string rangeOfString:otherString].length);
}
które w przypadku 1 i 2 powrócą
does string contains string - NO
To moje 2 centy ;-)
Proszę sprawdzić moją Gist, aby uzyskać bardziej pomocny kod.