2011-03-31 3 views
0
NSLog(@"move report - %@", [eventToArchive valueForKey:@"archived"]); 
if (![eventToArchive valueForKey:@"archived"]) { 
    .... 

Приведенный выше код блока НИКОГДА не быть введен, даже если NSLog возвращаетПочему этот блок IF не вводится после проверки на логическое свойство NSManagedObject?

move report - 0 

Каждый раз, когда он работает?

Нужно ли мне делать что-то вроде,

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

?

ответ

0

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

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

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

0

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

if(![eventToAcrhive.archived boolValue]) { 
    // not archived 
} 
1

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

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

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

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