19

簡単な質問があります(私は思います):NSNumberをintと比較して、0か1かを確認しようとしています。コードは次のとおりです。

id i = [dictionary objectForKey:@"error"]; //class = NSCFNumber

NSLog(@"%@ == 0 -> %@", i, i == 0);
NSLog(@"%@ == 0 -> %@", i, [i compare:[NSNumber numberWithBool:NO]]);

私はこれをメソッドに試しましたが、結果としてnullになります:

2010-10-17 21:57:49.065 Api[15152:a0f] 0 == 0 -> (null)
2010-10-17 21:57:49.065 Api[15152:a0f] 0 == 0 -> (null)

手伝って頂けますか?

4

5 に答える 5

49
  1. 比較の結果は、Objective-CオブジェクトではないBOOLです。したがって、を使用して印刷しない%@でください。代わりに試してください%d(0または1を表示します)。

  2. [a compare:b]a < bの場合は-1、の場合は0、の場合はa == b1を返しますa > b。したがって、2番目の結果が期待されます。

  3. NSNumberを整数と直接比較することはできません。これi == 0は実際には、 NULL(0)であるかどうかをチェックするポインターi比較であり、その数値が存在する場合はもちろんFALSEです。したがって、最初の結果も期待されます。

  4. 等しいかどうかを確認する場合は、を使用します[a isEqualToNumber:b]。または、整数を抽出し[a intValue]て別の整数と直接比較することもできます。

したがって、以下が機能するはずです。

NSLog(@"%@ == 0 -> %d", i, [i isEqualToNumber:[NSNumber numberWithInt:0]]);
NSLog(@"%@ == 0 -> %d", i, [i intValue] == 0);

「数値」が実際にブール値である場合は、-boolValue代わりに取得することをお勧めします。

NSLog(@"%@ == 0 -> %d", i, ! [i boolValue]);
于 2010-10-17T20:07:44.293 に答える
9

ここでは、オブジェクトiのポインタを0と比較していますが、これはあなたが望むものではないのではないかと思います。

あなたはおそらくiの値を比較したいと思うでしょう:

if ([i intValue]==0) {
  ...
}
于 2010-10-17T20:09:37.797 に答える
4

簡単に書くことができます:

NSNumber *number = [NSNumber numberWithInt:123];
int integer = 1234;

NSLog(@"%@ == %i : %i", number, integer, [number intValue] == integer);

出力は

123 == 1234 : 0


お役に立てれば幸いです。

于 2010-10-17T20:13:08.577 に答える
3

2 つの問題があります。

  • NSNumber オブジェクトとそれが表す値を混同しています。
  • フォーマット文字列が、指定した引数のタイプと一致しませNSLogん。

最初の問題について:iはアドレスで、おそらく のようなもの0x1f84bです。かどうかをテストするときi == 0は、かどうかをテストしていますi == NULL。この場合、存在しないキーを検索するとNULL.

[i intValue]一方、は整数です。NSNumberに整数として表現可能な値が含まれている場合、これが の値になりますNSNumber。これは、書式指定子NSNumberを使用して の説明を出力すると表示されるものです。%@

2 番目の問題について: C と Objective-C の比較では、0 (偽を意味する) または 1 (真を意味する) のいずれかの整数が返されます。したがって、比較の結果を直接出力するには、整数書式指定子を使用する必要があります。実際には、そのような指定子が 2 つあり、%i%d. 比較の結果を NSNumber にラップし%@て、それを印刷するために使用することもできますが、それは価値があるよりも多くの作業です。

したがって、ここであなたがすべきことは次のとおりです。

NSNumber *i = [dictionary objectForKey:@"error"];
BOOL haveValue = (i != NULL);
if (haveValue) {
    int iValue = [i intValue];
    NSLog(@"%d == 0 -> %d", iValue, iValue == 0);
    NSLog(@"%@ compared to 0 -> %d", i, [i compare:[NSNumber numberWithInt:0]]);
} else {
    NSLog(@"*** Dictionary has no value for key \"error\"!");
}
于 2010-10-17T20:23:06.650 に答える