我正在我的一个应用程序中浏览一些较旧的代码,并在可能存在潜在问题的区域中修复代码。
我看到很多旧代码使用...
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 或为空 (@")。
这里记录了位置将被NSNotFound
,length
将为 0,因此任何一项检查都可以工作,但是,我建议根据 NSNotFound
检查位置。
NSNotFound 被定义为 "NSIntegerMax"。即使它们产生相同的结果,您的第二个显示器也更具可读性和自我记录性。也许你不应该找到它们并改变它们,而只是切换到前进的方向。