У вас есть две проблемы:
- Вы путаете объект NSNumber со значением, которое оно представляет.
- Ваша строка формата
NSLog
не соответствует типам аргументов, которыеВы предоставляете.
Относительно первой проблемы: i
- это адрес, возможно, что-то вроде 0x1f84b
.Когда вы проверяете, действительно ли i == 0
, вы проверяете, действительно ли i == NULL
.В этом случае это означает, что вы проверяете, присутствовал ли ключ «ошибка» в словаре или нет, так как поиск несуществующего ключа приводит к NULL
.
[i intValue]
с другой стороны.рука, является целым числом.Если NSNumber
содержит значение, представимое в виде целого числа, это будет значение NSNumber
.Это то, что вы видите, когда печатаете описание NSNumber
с использованием спецификатора формата %@
.
Относительно второй проблемы: сравнения в C и Objective-C возвращают целое число, либо 0 (что означает ложь)) или 1 (имеется в виду истина).Чтобы напрямую напечатать результат сравнения, вам необходимо использовать спецификатор целочисленного формата.На самом деле существует два таких спецификатора, %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\"!");
}