所以我个人非常讨厌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美分;-)
请查看我的Gist以获得更多有用的代码。