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
}
Являются ли эти два метода идентичными, по существу, или нет?
Ответы
Ответ 1
Две проверки не всегда идентичны. Это зависит от того, как был создан диапазон. Пример:
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
.
Ответ 2
Ответ зависит от используемой функции/метода. NSRange
- это просто структура, поэтому вам нужно прочитать документацию для функции/метода, который вы вызываете.
<сильные > Примеры:
NSRangeFromString
Возвращает диапазон из текстового представления.
... Если aString не содержит целых чисел, эта функция возвращает Структура NSRange, значения местоположения и длины которой равны 0.
В этом случае проверка на NSNotFound
не будет работать.
- [NSString rangeOfString:]
... Возвращает {NSNotFound, 0}, если aString не найден или пуст (@"").
Здесь указано, что местоположение будет NSNotFound
, а length
будет 0, поэтому любая из проверок будет работать, однако я бы рекомендовал проверить местоположение на NSNotFound
.
Ответ 3
NSNotFound определяется как "NSIntegerMax". Даже если они дают тот же результат, ваш второй дисплей намного читабельнее и самодокументируется. Может быть, вы не должны находить их все и менять, а просто переключаться на это, двигаясь вперед.