所以我个人非常讨厌 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以获得更多有用的代码。