У вас есть две проблемы:
- Вы путаете объект 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\"!");
}
я должен помнить меня не использовать% @ :) Спасибо;) – patrick