3

私のコードでは、このテストを使用して、ユーザーが pickerView で何かを選択したことを確認しています。

if ( !selection || [selection isEqualToString:@"Select..."] ) {}

ただし、スタック オーバーフローに関する多くの投稿では、NSNull以下の例のようなテストを使用するか、テストすることをお勧めしています。

if ( selection.length == 0 || [selection isEqualToString:@"(null)"] ) {}

上記のコード行には、私が使用している null をすべてテストするさまざまなバリエーションもあります。!selection

私のテストは不完全で、バグが忍び寄る可能性がありますか? !selectionとこれらの他のテストの違いは何ですか?

4

3 に答える 3

2
selection.length == 0

長さ 0 の文字列と nil を同じものとして扱いたい場合に適していますが、これはよくあることです。nil オブジェクトにメッセージを送信しても安全であり、結果は nil、0、または 0.0 になるため、これを安全に行うことができます。

isEqualToString: を使用する必要があるだけです。たとえば、@"(null)" など、nil と同等として扱いたい他の可能な文字列がある場合、これは、ある種のオブジェクト グラフでテキスト データを変換するときに発生することがあります。 JSON を生成するコードが null を正しく処理しない JSON でこれを参照してください。

NSNull はオブジェクトであり、nil の代わりに NSNull のインスタンスを取得する可能性がある場合は、それについてもテストする必要がある場合があります。これは多くの JSON パーサーで発生します。コレクション オブジェクト (NSArray および NSDictionarys) に nil を格納する方法でもあります。

于 2012-09-11T00:20:26.223 に答える
1

私が予測できる唯一のバグは、ローカリゼーションのバグです。を使用してピッカー データをどこかに設定していて、現在のローカリゼーションに従って をNSLocalizedString()適切にチェックするのを忘れた場合はどうなりますか? @"Select..."特に、テスターがすべてのローカリゼーションを徹底的にテストしていない場合、それは非常に面倒です...

ただし、選択が であっても、 !selectionandは両方とも OK である必要があり、意味がありません...だから、私は次のように言うでしょう:selection.length == 0nilnil.length

if ( !selection || [selection isEqualToString:@"(null)"] ) {}
于 2012-09-10T23:47:30.747 に答える
1

まず、nil、NSNull、NULL の違いを理解する必要があります。

nil- (id)0 は、id初期化されていないオブジェクトを表しますが、配列に nil 値を追加できないなどのロジックにより、一部のパターンでは使用できません。

NSNull- 初期化された表現に使用されるシングルトン クラスnil- 配列に追加できます。

NULL- (void*)0 は、初期化されていないオブジェクトを表します。後方Cサポートのために存在する必要があります

初期化チェックのために、私は通常マクロを使用しています(obj != nil) && (obj != (id)[NSNull null])

空の文字列チェックには、使用できます

((obj != nil) && (obj != (id)[NSNull null]) && obj.length > 0 && [obj containsOnlyWhitespaceOrNewline] == NO)
于 2012-09-10T23:48:01.873 に答える