NSRange: range.location != NSNotFound vs. range.length > 0



我正在我的一个应用程序中浏览一些较旧的代码,并在可能存在潜在问题的区域中修复代码。

我看到很多旧代码使用...

NSRange range = //determine range here....
if(range.length > 0)
{
    //do stuff
}

该代码是否"很好",还是我应该将其更改为此代码?

NSRange range = //determine range here....
if(range.location != NSNotFound)
{
    //do stuff
}

这两种方法本质上是否相同?

这两个检查并不总是相同的。 这取决于范围的生成方式。 例:

NSRegularExpression *re = [NSRegularExpression
    regularExpressionWithPattern:@"(?= )" options:0 error:NULL];
NSTextCheckingResult *result = [re firstMatchInString:@"hello world"
    options:0 range:NSMakeRange(0, 11)];
NSLog(@"range = %@", NSStringFromRange(result.range));

范围的长度为 0,但其位置为 5,而不是 NSNotFound

答案取决于您使用的功能/方法。 NSRange只是一个结构,因此您需要阅读要调用的函数/方法的文档。

例子:

NSRangeFromString
返回文本表示形式的区域。

。如果 aString 不包含任何整数,则此函数返回 位置和长度值均为 0 的 NSRange 结构。

在这种情况下,检查NSNotFound将不起作用。


-[NSString rangeOfString:]

。返回 {NSNotFound, 0} 如果找不到 aString 或为空 (@")。

这里记录了位置将被NSNotFoundlength将为 0,因此任何一项检查都可以工作,但是,我建议根据 NSNotFound 检查位置。

NSNotFound 被定义为 "NSIntegerMax"。即使它们产生相同的结果,您的第二个显示器也更具可读性和自我记录性。也许你不应该找到它们并改变它们,而只是切换到前进的方向。

最新更新