Почему этот блок IF не вводится после проверки по логическому свойству NSManagedObject? - PullRequest
0 голосов
/ 31 марта 2011
NSLog(@"move report - %@", [eventToArchive valueForKey:@"archived"]);
if (![eventToArchive valueForKey:@"archived"]) {
   ....

Вышеупомянутый кодовый блок НИКОГДА не вводится, даже если NSLog возвращает

move report - 0

Каждый раз, когда он запускается?

Мне нужно сделать что-то вроде,

if (![NSNumber numberWithBool:[eventToArchive valueForKey:@"archived"]]) {

Ответы [ 3 ]

1 голос
/ 01 апреля 2011

Причина, по которой условный блок никогда не вводится, заключается в том, что -valueForKey: возвращает id, то есть указатель. Однако вы используете его, как если бы это был BOOL, поэтому единственный способ войти в этот блок - if -valueForKey: возвращает nil.

Ваш оператор журнала печатает «0» в качестве значения, потому что вы использовали спецификатор формата объекта, %@, который ожидает указатель и печатает описание объекта, на который указывает указатель. Вы, вероятно, присваиваете ему NSNumber *, и он правильно печатает значение, представленное этим объектом.

Предыдущие два ответа верны, указав, что вы должны использовать метод -boolValue, чтобы получить значение BOOL из номера NSNumber, полученного из -valueForKey:.

0 голосов
/ 01 апреля 2011

Предполагая, что 'archived' является логическим свойством в подклассе NSManagedObject, которое вам нужно сделать;

if(![eventToAcrhive.archived boolValue]) {
    // not archived
}
0 голосов
/ 01 апреля 2011

Это должно работать

if (![[eventToArchive valueForKey:@"archived"] boolValue])

boolValue работает на NSString с и NSNumber с, поэтому, если заархивированное свойство eventToArchive является BOOL, Key Value Coding автоматически преобразует это в NSNumber для вас.

...