Сравните NSNumber с int - PullRequest
       16

Сравните NSNumber с int

17 голосов
/ 18 октября 2010

У меня простой вопрос (я думаю): Я пытаюсь сравнить NSNumber с int, чтобы увидеть, если это 0 или 1. Вот код:

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)

Вы можете мне помочь?

Ответы [ 5 ]

46 голосов
/ 18 октября 2010
  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), что, конечно, ЛОЖЬ, если это число существует.Так что 1-й результат также ожидается.

  4. Если вы хотите проверить равенство, используйте [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]);
9 голосов
/ 18 октября 2010

Здесь вы сравниваете указатель объекта i с 0, что, боюсь, не то, что вы хотите.

Скорее всего, вы хотите сравнить значение i:

if ([i intValue]==0) {
  ...
}
3 голосов
/ 18 октября 2010

У вас есть две проблемы:

  • Вы путаете объект 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\"!");
}
3 голосов
/ 18 октября 2010

Вы можете легко написать:

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

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

Вывод должен быть

123 == 1234 : 0


Я надеюсь, что смогу вам помочь!

0 голосов
/ 30 марта 2017

Это сработало

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