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

时间:2012-10-10 20:30:26

标签: ios objective-c nsstring nsrange

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

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

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

该代码是“正常”,还是应该将其更改为?

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

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

3 个答案:

答案 0 :(得分:12)

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

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

答案 1 :(得分:6)

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

<强>示例:

NSRangeFromString
返回文本表示的范围。

  

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

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


-[NSString rangeOfString:]

  

...如果找不到aString或者为空(@“”),则返回{NSNotFound,0}。

此处记录的位置将为NSNotFoundlength将为0,因此任何一项检查都可以,但我建议您根据NSNotFound检查位置。< / p>

答案 2 :(得分:0)

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