簡単な質問があります(私は思います):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)
手伝って頂けますか?
比較の結果は、Objective-CオブジェクトではないBOOLです。したがって、%@
を使用してnot印刷する必要があります。代わりに%d
を試してください(0または1を表示)。
[a compare:b]
は、a < b
の場合は-1、a == b
の場合は0、a > b
の場合は1を返します。したがって、2番目の結果が期待されます。
NSNumberを整数と直接比較することはできません。そのi == 0
は実際にはポインタの比較であり、i
がNULL(0)であるかどうかをチェックします。もちろん、その数が存在する場合はFALSEです。したがって、最初の結果も期待されます。
等しいかどうかを確認する場合は、 [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]);
ここでは、オブジェクトiのポインタを0と比較していますが、これはあなたが望むものではないのではないかと思います。
あなたはおそらくiの値を比較したいと思うでしょう:
if ([i intValue]==0) {
...
}
あなたは簡単に書くことができます:
NSNumber *number = [NSNumber numberWithInt:123];
int integer = 1234;
NSLog(@"%@ == %i : %i", number, integer, [number intValue] == integer);
出力は
123 == 1234 : 0
私があなたを助けることができることを願っています!
2つの問題があります。
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\"!");
}
これはうまくいった
if (thevariable.intValue==0) {
...
}