15

アプリの 1 つで古いコードを調べて、潜在的に問題がある可能性のある領域のコードを修正しています。

私は多くの古いコードを使用しています...

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

そのコードは「問題ありません」か、これに変更する必要がありますか?

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

これらの 2 つの方法は本質的に同じですか、それともそうではありませんか?

4

3 に答える 3

12

2 つのチェックは必ずしも同一ではありません。範囲がどのように生成されたかによって異なります。例:

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 ですが、位置は ではなく 5NSNotFoundです。

于 2012-10-10T20:47:45.217 に答える
6

答えは、使用している関数/メソッドによって異なります。NSRangeは単なる構造体なので、呼び出す関数/メソッドのドキュメントを読む必要があります。

例:

NSRangeFromString
テキスト表現から範囲を返します。

... aString に整数が含まれていない場合、この関数は位置と長さの値が両方とも 0 である NSRange 構造体を返します。

この場合、チェックは機能しNSNotFoundません。


-[NSString rangeOfString:]

... aString が見つからないか空 (@"") の場合、{NSNotFound, 0} を返します。

NSNotFoundここでは、場所が になり、が 0 になることが文書化されているlengthため、どちらのチェックも機能しますが、場所を に対して確認することをお勧めしNSNotFoundます。

于 2012-10-10T20:49:30.720 に答える
0

NSNotFoundは「NSIntegerMax」として定義されています。同じ結果が得られたとしても、2番目のディスプレイははるかに読みやすく自己文書化されます。たぶん、あなたはそれらすべてを見つけてそれらを変えるべきではなく、ただ前進することに切り替えるだけです。

于 2012-10-10T20:34:26.600 に答える