Как написать действительное логическое условие в target-c, используя objectForKey - PullRequest
2 голосов
/ 05 января 2011

Я пытаюсь понять, почему следующее всегда попадает в предложение ELSE. Чего я не могу понять, так это того, что независимо от фактического значения (NSLog показывает 0 или 1), оно всегда попадает в другое. Любая причина почему?

Элемент NSArray извлекается из объекта JSON -fyi

BOOL* instock = [item objectForKey:@"itemInStock"];
    obj.instock = instock;
    NSLog(@"and it was %@", obj.instock);
    if (obj.instock == YES) {
      //do yes stuff
    }else {
      //do no stuff
    }

Ответы [ 2 ]

4 голосов
/ 05 января 2011

Ваш код здесь довольно странный. Какой тип obj.instock? Ваша самая первая строка

BOOL* instock = [item objectForKey:@"itemInStock"];

не имеет никакого смысла вообще. -objectForKey: не возвращает BOOL* значений. Возвращает id. Я предполагаю, что на самом деле вы получаете NSNumber * обратно, и это просто работает нормально, потому что NSNumber * вписывается в BOOL * (так как они оба указатели). Точно так же obj.instock, вероятно, также будет NSNumber* (если бы это не был какой-либо объект, ваш NSLog() потерпит крах).

Итак, если предположить, что obj.instock является NSNumber*, то условием, которое вы хотите, будет просто

if ([obj.instock boolValue]) {
    // yes
} else {
    // no
}

Вам также следует исправить этот код, чтобы не пытаться утверждать, что у вас есть BOOL*, если у вас его нет.

1 голос
/ 05 января 2011

В вашем NSLog вы используете %@.
%@ относится к объектам.Вопреки вашему BOOL* instock, который не является объектом.

Есть способы исправить это.
Какой тип данных возвращает [item objectForKey:@"itemInStock"];?
Если, например, возвращается NSNumber, вы можете сделать:

obj.instock = [[item objectForKey:@"itemInStock"] boolValue];
NSLog(@"and it was %d", obj.instock);
if (obj.instock == YES) {
  //do yes stuff
}else {
  //do no stuff
}

Опять же, есть и другие способы сделать это.

...