这可能听起来像一个愚蠢的问题,但Apple为我们提供了NSNotFound,但为什么他们没有提供一个名为NSFound的?有没有办法可以自己定义NSFound宏?
我问这一切的原因是,为了让我检查字符串是否包含某个字符,我必须做双重否定,即
if ([XML rangeOfString:@"error" options:NSCaseInsensitiveSearch].location != NSNotFound)
{
//server is down
}
else
{
//server is up
}
至少对我而言,如果我可以简单地这样做,那将会更容易阅读
if ([XML rangeOfString:@"error" options:NSCaseInsensitiveSearch].location == NSFound)
{
//server is down
}
else
{
//server is up
}
如果我想定义NSFound或SAMFound,我该怎么做呢?
答案 0 :(得分:2)
您的问题实际上是使用rangeOfString
之后的设计模式方法 - 对两个有效结果使用单个返回值,其中有许多结果,以及失败指示,其中有一个。在这种情况下,您可以通过与常量NSNotFound
的比较来测试单个失败值,但是您不能通过简单的比较同样测试许多可能的值 - 而是使用"双阴性&#34 ;你不喜欢。
如果你发现它太难看了改变它......也许:
@interface NSString (SamExtras)
- (BOOL) SAMcontainsString:(NSString *)string options:(NSStringCompareOptions)options;
@end
@implementation NSString (SamExtras)
- (BOOL) SAMcontainsString:(NSString *)string options:(NSStringCompareOptions)options
{
return [self rangeOfString:string options:options].location != NSNotFound;
}
@end
允许您使用:
if ([XML SAMcontainsString:@"error" options:NSCaseInsensitiveSearch])
{
//server is down
}
else
{
//server is up
}
没有双重否定。您可以编写一次类别并在所有项目中使用它。
HTH
答案 1 :(得分:1)
Double Negative 在语法中没有代码的结果。
他们提供 not 的原因与找到的版本相反,只是 not 找到的值是单个(假设无效)值,其他一切都是有效。因此,定义这个单一的无效值更简单。
同样更有意义(更有效,避免双重搜索和更少的代码)将NSRange
存储在局部变量中,以便首先测试有效性,然后使用值:
NSRange range = [XML rangeOfString:@"error" options:NSCaseInsensitiveSearch];
if (range.location != NSNotFound) {
// Do thing with range
} else {
// Complain
}
答案 2 :(得分:1)
原始测试没有任何错误:
if ([XML rangeOfString:@"error" options:NSCaseInsensitiveSearch].location != NSNotFound) {
如果你需要知道的是XML
是否包含字符串@"error"
,那么该测试会回答问题,并且是一种完全合法且惯用的方式。请注意,即使文档告诉您containsString:
只是调用rangeOfString:options:
的前线!
如果你真的想知道正面版本是什么,那就是测试返回范围的length
,看看它是否与length
的{{1}}相同}。未找到范围的@"error"
为length
。