2009-07-17 17 views
507

Necesito comprobar si el objeto es del tipo NSString o UIImageView. ¿Cómo puedo lograr esto? ¿Hay algún tipo de método "isoftype"?En Objective-C, ¿cómo pruebo el tipo de objeto?

+0

Ver: [En Objective-C ¿cuál es el equivalente de la palabra clave java "instanceof"?] (Http://stackoverflow.com/questions/536396/in-objective-c-what-is-the-equivelant- of-the-java-instanceof-keyword) – Reunanen

+31

Sí hay: '[object isKindOfClass: [ClassName class]]' –

Respuesta

813

Si su objeto es myObject, y que desea probar para ver si se trata de una NSString, el código sería:

[myObject isKindOfClass:[NSString class]] 

Del mismo modo, si se quería probar myObject para un UIImageView:

[myObject isKindOfClass:[UIImageView class]] 
+80

Tenga en cuenta que también hay un método isMemberOfClass que comprobará la clase "exactness". Sin embargo, tenga cuidado con esto, ya que muchos objetos de Apple son en realidad tipos de Fundamentos básicos disfrazados. (Por ejemplo, un NSString es más a menudo un NSCFString, y esMemberOfClass: devolverá falso para esta comparación.) –

+2

¡Tenga en cuenta que este método es muy lento! – SAKrisT

+0

¿Es correcto saber que NSString es un clúster de clase? (como NSNumber) – Ricardo

53

Es probable que utilice

- (BOOL)isKindOfClass:(Class)aClass 

Este es un método de NSObject.

Para obtener más información, consulte la documentación de NSObject.

Así es como se usa esto.

BOOL test = [self isKindOfClass:[SomeClass class]]; 

También puede intentar hacer algo como esto

for(id element in myArray) 
{ 
    NSLog(@"======================================="); 
    NSLog(@"Is of type: %@", [element className]); 
    NSLog(@"Is of type NSString?: %@", ([[element className] isMemberOfClass:[NSString class]])? @"Yes" : @"No"); 
    NSLog(@"Is a kind of NSString: %@", ([[element classForCoder] isSubclassOfClass:[NSString class]])? @"Yes" : @"No");  
} 
+2

¿Qué es esto 'className' No puedo hacer que funcione con mi ID –

+4

Sí, no existe tal cosa –

+4

-1: No use' className', puede que funcione o no en OS X, pero no está en iOS y no está destinado a ser utilizado para esto. Además, esos 'NSLog's no hacen lo que creo que usted quiso decir con ellos: están verificando el nombre de la clase (siempre una cadena) y la clase del codificador, curiosamente, en lugar de la clase del elemento real. – andyvn22

11

Ejecución de una prueba simple, que pensé en documentar lo que funciona y lo que no. A menudo veo personas revisando para ver si la clase del objeto es un miembro de la otra clase o es igual a la otra clase.

Para la línea a continuación, tenemos algunos datos mal formados que pueden ser NSArray, NSDictionary o (null).

NSArray *hits = [[[myXML objectForKey: @"Answer"] objectForKey: @"hits"] objectForKey: @"Hit"]; 

Estas son las pruebas que se realizaron:

NSLog(@"%@", [hits class]); 

if ([hits isMemberOfClass:[NSMutableArray class]]) { 
    NSLog(@"%@", [hits class]); 
} 

if ([hits isMemberOfClass:[NSMutableDictionary class]]) { 
    NSLog(@"%@", [hits class]); 
} 

if ([hits isMemberOfClass:[NSArray class]]) { 
    NSLog(@"%@", [hits class]); 
} 

if ([hits isMemberOfClass:[NSDictionary class]]) { 
    NSLog(@"%@", [hits class]); 
} 

if ([hits isKindOfClass:[NSMutableDictionary class]]) { 
    NSLog(@"%@", [hits class]); 
} 

if ([hits isKindOfClass:[NSDictionary class]]) { 
    NSLog(@"%@", [hits class]); 
} 

if ([hits isKindOfClass:[NSArray class]]) { 
    NSLog(@"%@", [hits class]); 
} 

if ([hits isKindOfClass:[NSMutableArray class]]) { 
    NSLog(@"%@", [hits class]); 
} 

isKindOfClass funcionó bastante bien, mientras que isMemberOfClass no lo hicieron.

12

Cuando se desea diferir entre una superclase y la inheritedClass puede utilizar:

if([myTestClass class] == [myInheritedClass class]){ 
    NSLog(@"I'm the inheritedClass); 
} 
if([myTestClass class] == [mySuperClass class]){ 
    NSLog(@"I'm the superClass); 
} 

Usando - (BOOL)isKindOfClass:(Class)aClass en este caso resultaría en TRUE en ambas ocasiones porque el inheritedClass es también una especie de la superclase.

+2

'isMemberOfClass:' devolverá 'NO' al tratar con subclases. – mipadi

6

Puede utilizar el siguiente código en caso de que desee comprobar los tipos de datos primitivos.

// Returns 0 if the object type is equal to double 
strcmp([myNumber objCType], @encode(double)) 
4

Simple, [yourobject class] devolverá el nombre de clase de yourobject.

+1

En realidad devolverá un objeto 'Clase'. Sin embargo, la 'descripción' de este objeto será el nombre de la clase como una cadena, por lo que puede, por lo tanto, todavía iniciar sesión en la consola. – devios1

Cuestiones relacionadas