15

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

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

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

那个代码“很好”,还是我应该把它改成这个?

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

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

4

3 回答 3

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

于 2012-10-10T20:47:45.217 回答
6

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

例子:

NSRangeFromString
从文本表示中返回一个范围。

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

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


-[NSString rangeOfString:]

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

此处记录了 location 将为0 NSNotFoundlength因此任何一项检查都可以工作,但是,我建议对照NSNotFound.

于 2012-10-10T20:49:30.720 回答
0

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

于 2012-10-10T20:34:26.600 回答