2010-10-17 3 views
15

Я простой вопрос (я думаю): Я пытаюсь сравнить NSNumber с междунар, чтобы увидеть, если это 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 на самом деле является pointer сравнение, которое проверяет, является ли i NULL (0), что, конечно, FALSE, если это число существует. Таким образом, ожидается и 1-й результат.

  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

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\"!"); 
} 
Смежные вопросы