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\"!");
}