2011-10-25 14 views

Respuesta

84
if([obj isKindOfClass:[NSArray class]]){ 
    //Is array 
}else if([obj isKindOfClass:[NSDictionary class]]){ 
    //is dictionary 
}else{ 
    //is something else 
} 
12

Trate

[myObject isKindOfClass:[NSArray class]] 

y

[myObject isKindOfClass:[NSDictionary class]] 

Ambos deben devolver valores BOOL. Este es el uso básico del método NSObject:

-(BOOL)isKindOfClass:(Class)aClass 

Por un poco más información, consulte esta respuesta aquí: In Objective-C, how do I test the object type?

8

considerar el caso cuando estás analizar los datos de un JSON o XML respuesta. Dependiendo de la biblioteca de análisis que está utilizando, no puede terminar con NSArrays o NSDictionaries. En su lugar, puede tener __NSCFArray o __NSCFDiccionario.

En ese caso, la mejor manera de comprobar si tiene una matriz o un diccionario es comprobar si responde a un selector que sólo una matriz o diccionario responderían a:

if([unknownObject respondsToSelector:@selector(lastObject)]){ 

// You can treat unknownObject as an NSArray 
}else if([unknownObject respondsToSelector:@selector(allKeys)]){ 

// You can treat unknown Object as an NSDictionary 
} 
+2

-1 Muchos objetos pueden responder a los mismos selectores, especialmente algo tan genérico como 'lastObject' o' allKeys'. Usar 'isKindOfClass:' es claramente el camino a seguir cuando se trata de clusters de clases como 'NSArray' y' NSDictionary'. – Calrion

+1

Esa respuesta es una tontería total. [myObject isKindOfClass: [NSArray class]] responde correctamente a la pregunta "will myObject se comportará como si fuera un NSArray", y eso es lo que desea. No hay un selector al que solo responda NSArray o NSDictionary. En dos minutos puedo crear una clase con los métodos de instancia "allKeys" y "lastObject". O agregue "allKeys" como método de categoría a NSArray. – gnasher729

0

Por si acaso alguien llega tarde a esta fiesta en busca de un equivalente de Swift, aquí tienes. Es mucho más elegante que la versión de Objective-C, en mi humilde opinión, porque no sólo comprobar los tipos, pero arroja que el tipo deseado al mismo tiempo:

if let arrayVersion = obj as? NSArray { 
    // arrayVersion is guaranteed to be a non-`nil` NSArray 
} else if let dictionaryVersion = obj as? NSDictionary { 
    // dictionaryVersion is guaranteed to be a non-`nil` NSDictionary 
} else { 
    // it's neither 
} 
Cuestiones relacionadas