2012-10-10 3 views
13

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

Эти два метода идентичны, по существу, или нет?

ответ

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.

+0

Интересный встречный пример теории, согласно которой проверка местоположения, равная NSNotFound и length> 0, по существу одинакова ... – MikeS

+1

Для справки о том, что должна сказать документация для 'NSRegularExpressions': _ Если возвращаемый результат не равен нулю, тогда [диапазон результатов] всегда будет допустимым диапазоном, поэтому нет необходимости сравнивать его с {NSNotFound, 0 }. Однако для некоторых регулярных выражений (хотя и не для примера) некоторые группы захвата могут участвовать или не участвовать в заданном совпадении. Если данная группа захвата не участвует в заданном совпадении, тогда [result rangeAtIndex: idx] вернет {NSNotFound, 0} ._ – Joe

0

NSNotFound определяется как «NSIntegerMax». Даже если они дают тот же результат, ваш второй дисплей намного читабельнее и самодокументируется. Может быть, вам не стоит их находить и менять, а просто переключаться на это.

+0

Итак, в реализации они идентичны, но предпочтительным использованием является проверка, если range.location равно NSNotFound или нет? – MikeS

+0

Я чувствую, что мы сейчас просто говорим о стиле, так как я считаю, что оба дадут вам тот же результат. Я просто подумал бы, что если вы прочтете второй, то он течет и имеет смысл «местоположение диапазона найдено или не найдено», а не первое, что требует интерпретации. В любом случае это довольно мало, и вы можете просто выбрать одно соглашение для всего файла для согласованности. – rooster117

5

Ответ зависит от функции/метода, который вы используете. NSRange - это просто структура, поэтому вам нужно прочитать документацию для функции/метода, которую вы вызываете.

Примеры:

NSRangeFromString
возвращает диапазон от текстового представления.

... Если aString не содержит целых чисел, эта функция возвращает NSRange-структуру, местонахождение и длины значения как 0.

В этом случае проверка на NSNotFound не будет работать.


-[NSString rangeOfString:]

... Возвращает {NSNotFound, 0}, если aString не найден или пуст (@ "").

Здесь документально подтверждено, что местоположение будет NSNotFound и length будет 0, так как из проверок будет работать, однако, я рекомендовал бы проверить расположение против NSNotFound.

+0

Так звучит, что действительно имеет значение в моем вопросе, как определяется диапазон и что я ' m пытается сделать с диапазоном. – MikeS

+0

Да, прочтите документацию, чтобы определить, что вам нужно проверить. – Joe