2010-10-17 121 views
15

我有一個簡單的問題(我認爲): 我想一個比較的NSNumber用INT,看它是否是0或1。以下是代碼:一個比較向的NSNumber一個int

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

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

我嘗試這樣的方法,但我得到空的結果是:

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) 

你能幫助我嗎?

回答

40
  1. 比較結果是一個BOOL,它不是一個Objective-C對象。因此,您應該使用%@打印它而不是。改爲嘗試%d(顯示0或1)。

  2. [a compare:b]返回-1,如果a < b,0,如果a == b和1如果a > b。所以你的第二個結果是預期的。

  3. 您無法直接將NSNumber與整數進行比較。 i == 0實際上是一個指針比較,它檢查i是否爲NULL(0),如果該數字存在,當然這是否爲FALSE。所以第一個結果也是可以預料的。

  4. 如果你想檢查是否相等,use [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]); 
+0

,我應該還記得我不使用%@ :)謝謝;) – patrick 2010-10-17 20:19:23

9

這裏您將對象i的指針與0進行比較,恐怕不是您想要的。

你最想比較i的值:

if ([i intValue]==0) { 
    ... 
} 
3

你可以隨便寫:

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

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

輸出應該是

123 == 1234 : 0 


我希望我能幫你!

3

你有兩個問題:

  • 你混淆了它所代表的價值的NSNumber對象。
  • 您的NSLog格式字符串與您提供的參數類型不匹配。

關於第一個問題:i是一個地址,可能類似於0x1f84b。當您測試是否i == 0時,您正在測試是否i == NULL。在這種情況下,這意味着您正在測試密鑰「錯誤」是否出現在字典中,因爲查找不存在的密鑰獲得了NULL

[i intValue]另一方面,是一個整數。如果NSNumber包含可表示爲整數的值,則這將是NSNumber的值。這是您使用%@格式說明符打印NSNumber的說明時看到的內容。

關於第二個問題:在C和Objective-C中的比較返回一個整數,即0(表示false)或1(意思是true)。爲了直接打印比較結果,您需要使用整數格式說明符。實際上有兩個這樣的說明符,%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\"!"); 
} 
0

這個工作

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