7

私はカテゴリに取り組んでおり、NSArray実装した関数の 1 つは、配列内の文字列の数 (または数値ではない) を返すように設計されています。これはすべて正常に機能しますが、私の質問はNSNotFound、入力配列のカウントがゼロの場合の戻り値としての使用についてです。

Apple のドキュメントの状態:

NSNotFound は通常、シリアル データ内のアイテムを検索し、文字列オブジェクト内の文字や NSArray オブジェクト内の ID などのインデックスを返すさまざまなメソッドや関数で使用されます。

indexOfObject:これは、配列に含まれていないアイテムに使用する場合、完全に理にかなっています。しかし、NSNotFound正しい使用法の下に示されているコンテキストで使用していますか? 確かに、ゼロを返して 1 日と呼ぶこともできます2147483647が、問題がどこにあるかを確認してすぐに知ることは役に立ちます。

- (NSUInteger)countOfStringsInArray {
    NSUInteger currentCount = 0;
    if ([self count] > 0) {
        for (id obj in self) {
            if (![obj integerValue]) {
                currentCount ++;
            }
        }
        return currentCount;
    }
    return NSNotFound;
}
4

4 に答える 4

5

いいえ、この場合は違います。この例のメソッドはcount を返します。indexNSNotFoundを返すメソッドで (たとえば) using/return を検討するとよいでしょう。ここで、有効なインデックスであるため、誤った結果になります。0

したがって、「はい、単に0を返す必要があり、戻り値の型は符号なし(NSUInteger)にする必要があります」と、カウントに関連付けるNSNotFoundべきではない. これは、魔法の値に依存することなく、実際にケースをカバーします。

問題がどこにあるかを知りたい場合 (そして私自身も頻繁にこれを行っています)、代わりに、コレクションが空のときにメソッドを呼び出すのはプログラマーのエラーと見なす方が望ましいと思います。

于 2012-11-09T07:04:28.073 に答える
2

カウントを として呼び出すことはできないと思いますNSNotFound。カウントは 0 以上のみです。私の意見では、「見つからない」ことは決してありません。配列が空であるか、配列が nil のときに[NSArray count]返される場合は、そうでしたか? NSNotFound要するに、NSNotFoundこの特定のケースでの使用は標準的な方法ではないと感じています。少なくともアップルはそのようにそれを使用したことはありません.

おそらく、ゼロをデフォルトのケースとして使用するか、それを表すために独自の列挙型を定義する必要があるかもしれません。NSNotFoundデフォルト値として 0 を使用できない場合にのみ役立ちます (そのような場合、-1 が受け入れられる場合、または NSNotFoundを表すため使用できる場合は、デフォルト値として -1 を使用できますNSIntegerMax)。

于 2012-11-09T06:54:09.603 に答える
1

特にNSNotFoundの推奨される使用法を考えると、あなたがどこから来たのかがわかります。ただし、このコードを継承する後続の開発者にとって、提案された実装は直感的ではないと思います。

代わりに NSRange の戻り値を使用することをお勧めします。Apple の定義によると、NSRange は「文字列内の文字や NSArray オブジェクト内のオブジェクトなど、シリーズの一部を記述するために使用される構造」です。それはまさにあなたが持っているものです。

具体的には、NSRange の位置メンバーは、配列内で最初に見つかった文字列のインデックスであり、長さメンバーは、見つかった文字列の数である可能性があります。

また、NSRange を返す他のメソッド (NSString:rangeOfString など) と同様に、文字列が見つからない場合は、場所を NSNotFound に設定できます。

それが役立つことを願っています。

于 2012-11-09T07:22:05.123 に答える
0

NSNotFound は unsigned int 用であるため、短縮されて間違っている可能性があるため、NSInteger メソッドから返す必要があります (潜在的に)

つまり、**メソッド 'countOfStringsInArray' は n NSUInteger を返す必要があります (nsarray.count と同じ)

于 2012-11-09T07:30:26.453 に答える