2012-09-16 9 views
5

Tengo una variable llamada asistencia que se saca de un feed JSON. Después de comprobar qué clase de tipo de objeto se interpreta como NSLog esto:comprobando el valor booleano de Diccionario.

attending var type is: __NSCFBoolean 

Esto se hace usando [code clase] para obtener el tipo de clase de la variable.

así que quiero ver si esto es verdadero o falso .... así que escribir el código ..:

if([[_events objectAtIndex:indexPath.row] objectForKey:@"attending"] == YES){ 

Sin embargo no puedo compilar porque me da un error de texto amarillo diciendo lo siguiente:

enter image description here

¿Qué estoy haciendo mal? Cómo puedo arreglar esto. Sólo para añadir los datos en la alimentación se ve así:

{ 
    attendees =   (
    ); 
    attending = 1; 
    date = "2012-09-24 09:11:00"; 
    id = 504; 
    lessonHTML = "somehtml."; 
    name = "Sup"; 
    youtubeId = "http://www.youtube.com/watch?v=j1vb4cND3G0"; 
}, 
    { 
    attendees =   (
    ); 
    attending = 1; 
    date = "2012-09-24 09:11:00"; 
    id = 503; 
    lessonHTML = "somehtml."; 
    name = "Sup"; 
    youtubeId = "http://www.youtube.com/watch?v=j1vb4cND3G0"; 
}, 
    { 
    attendees =   (
    ); 
    attending = 0; 
    date = "2012-09-24 09:11:00"; 
    id = 508; 
    lessonHTML = "somehtml."; 
    name = "Sup"; 
    youtubeId = "http://www.youtube.com/watch?v=j1vb4cND3G0"; 
}, 
    { 
    attendees =   (
    ); 
    attending = 1; 
    date = "2012-09-24 09:11:00"; 
    id = 509; 
    lessonHTML = "somehtml."; 
    name = "Sup"; 
    youtubeId = "http://www.youtube.com/watch?v=j1vb4cND3G0"; 
}, 
    { 
    attendees =   (
    ); 
    attending = 0; 
    date = "2012-09-24 09:11:00"; 
    id = 505; 
    lessonHTML = "somehtml."; 
    name = "Sup"; 
    youtubeId = "http://www.youtube.com/watch?v=j1vb4cND3G0"; 
}, 
    { 
    attendees =   (
    ); 
    attending = 1; 
    date = "2012-09-24 09:11:00"; 
    id = 506; 
    lessonHTML = "somehtml."; 
    name = "Sup"; 
    youtubeId = "http://www.youtube.com/watch?v=j1vb4cND3G0"; 
}, 

Respuesta

18

booleana en el diccionario y otros contenedores clases están encapsulados en NSNumber objetos (ver la documentación NSNumber de más información)

Para extraer el valor que necesita para enviar el mensaje boolValue al objeto re recuperan en torno del diccionario y compararlo con SI/NO:

NSNumber* attendingObject = [[events objectAtIndex:indexPath.row] objectForKey:@"attending"]; 
if ([attendingObject boolValue] == YES) 
{ 
    ... 
} 

Más información acerca de los valores y la forma en que se encapsulan las clases de colección I in the Apple documentation here

+0

que sir es una leyenda! Mi pregunta es respondida y mi búsqueda está completa. ganas 100 experiencia – jimbob

+0

contento de ayudar ;-) – AliSoftware

+0

gran ayuda, gracias. Me pregunto en qué se convirtió esto rápidamente 1, 2 o 3 ... – eddyce

2

un tipo "BOOL" no es un objeto Objective C, pero en lugar de un tipo de estilo C.

Se almacena en un diccionario como un objeto "NSNumber".

Así que lo que hay que hacer en lugar de:

if([[_events objectAtIndex:indexPath.row] objectForKey:@"attending"] == YES){ 

es algo como esto:

BOOL attending = NO; // assume NO to start with 
NSDictionary * lessonDictionary = [_events objectAtIndex: indexPath.row]; 
if(lessonDictionary) 
{ 
    NSNumber * attendingObject = [lessonDictionary objectForKey: @"attending"]; 
    if(attendingObject) 
    { 
      attending = [attendingObject boolValue]; 
    } 
} 
Cuestiones relacionadas