web-dev-qa-db-ja.com

NSNumberをintと比較します

簡単な質問があります(私は思います):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)

手伝って頂けますか?

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

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

  3. NSNumberを整数と直接比較することはできません。そのi == 0は実際にはポインタの比較であり、iがNULL(0)であるかどうかをチェックします。もちろん、その数が存在する場合は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]);
46
kennytm

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

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

if ([i intValue]==0) {
  ...
}
9
Victor Jalencas

あなたは簡単に書くことができます:

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

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

出力は

123 == 1234 : 0


私があなたを助けることができることを願っています!

3
Paul Warkentin

2つの問題があります。

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

最初の問題について:iはアドレスであり、おそらく0x1f84bのようなものです。 i == 0かどうかをテストするときは、i == NULLかどうかをテストしています。この場合、存在しないキーを検索するとNULLが得られるため、キー「エラー」が辞書に存在するかどうかをテストしていることを意味します。

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

2番目の問題について:CとObjective-Cの比較では、0(偽を意味する)または1(真を意味する)のいずれかの整数が返されます。したがって、比較の結果を直接出力するには、整数形式指定子を使用する必要があります。実際には、そのような指定子は%i%dの2つです。比較の結果を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\"!");
}
3

これはうまくいった

if (thevariable.intValue==0) {
  ...
}
0
Naishta