Подтвердить что ты не робот

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
}

Являются ли эти два метода идентичными, по существу, или нет?

4b9b3361

Ответ 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". Даже если они дают тот же результат, ваш второй дисплей намного читабельнее и самодокументируется. Может быть, вы не должны находить их все и менять, а просто переключаться на это, двигаясь вперед.