2010-05-03 5 views
4

Есть ли способ проверить, имеет ли значение значение NULL/Nil перед назначением BOOL?Как проверить, является ли BOOL нулевым?

Например, у меня есть значение в NSDictionary, который может быть либо TRUE/FALSE/NULL

mySTUser.current_user_following = [[results objectForKey:@"current_user_following"]boolValue]; 

Если значение равно NULL я получаю следующее сообщение об ошибке

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSNull boolValue]: unrecognized selector sent to instance 

Я хотел бы чтобы иметь возможность обрабатывать случай NULL.

+4

Просто так вы ясно, в Obj-C следующие значения равны: 0, NO, NULL, ноль. Возвращаемое значение из вашего словаря - это объект NSNull, а не NULL. Вот почему @ChristopheD проверяет '[NSNull null]', а не NULL. – kubi

ответ

10

Вы должны check for[NSNull null]:

id vUser = [results objectForKey:@"current_user_following"]; 

if (vUser != [NSNull null]) { 
    // do stuff... 
} 
else { 
    // handle the case appropriately... 
} 
+0

Зачем вызывать 'objectForKey:' дважды для одного и того же ключа? –

+0

@gf: хорошая точка, обновил мое сообщение немного ;-) – ChristopheD

+3

Вы также должны проверить, не возвращается ли nil, т. Е. В словаре нет записи для ключа. – JeremyP

5

Вы можете сначала проверить и назначить условно, например. что-то вроде следующего:

if (NSValue* val = [results objectForKey:@"current_user_following"]) { 
    mySTUser.current_user_following = [val boolValue]; 
} 

Это:

  • избегает вызова objectForKey: дважды, сохраняя результат в переменной
  • ограничивает сферу переменной в if заявлении
  • работает, потому что nil эквивалентно 0
  • , таким образом, выполняется только оператор присваивания, если val не nil

Чтобы дополнительно проверить для значения, NSNull вам придется добавить еще один тест, данное ChristopheD, но я вопрос кастрированный баран NSNull действительно нужен здесь - YES/NO должно быть достаточно для описания как " «.
Если у вас нет полезного значения для ключа, вы можете просто удалить его из словаря или не вставить его в первую очередь.

+0

Вы имели в виду [val boolValue], а не [obj boolValue]? – progrmr

+0

@ kk6yb: Ой, спасибо. –

+1

Это не работает для меня .. (разработка для 10.6 целей с ARC). Я получаю компилятор ERRORS с надписью «Неожиданное имя интерфейса« NSValue »: ожидаемое выражение. Я мог бы удалить назначение NSValue внутри чек для nil .. но это могло бы сорвать цель, уничтожить краткость этого решения. –

Смежные вопросы