可以定义NSFound宏吗?

时间:2016-03-17 15:03:01

标签: ios objective-c

这可能听起来像一个愚蠢的问题,但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,我该怎么做呢?

3 个答案:

答案 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