En Objective-C, ¿cómo pruebo el tipo de objeto?

Respuestas:

881

Si su objeto es myObject, y desea probar para ver si es un NSString, el código sería:

[myObject isKindOfClass:[NSString class]]

Del mismo modo, si desea probar myObjectpara UIImageView:

[myObject isKindOfClass:[UIImageView class]]
mmc
fuente
90
Tenga en cuenta que también existe un método isMemberOfClass: que verificará la "exactitud" de la clase. Sin embargo, tenga cuidado, ya que muchos objetos de Apple son en realidad tipos de Core Foundation disfrazados. (Por ejemplo, un NSString es más a menudo un NSCFString, y esMemberOfClass: devolverá falso para esta comparación.)
Craig Otis
3
Tenga en cuenta que este método es muy lento!
SAKrisT
¿Es correcto saber que NSString es un grupo de clases? (como NSNumber)
Ricardo
52

Probablemente usarías

- (BOOL)isKindOfClass:(Class)aClass

Este es un método de NSObject.

Para más información consulte la NSObjectdocumentación.

Así es como usas esto.

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

También podrías 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");    
}
Bryan Hare
fuente
44
-1: No lo use className, puede o no funcionar en OS X, pero no está en iOS y no debe usarse para esto. Además, esos NSLogno hacen lo que creo que querías que hicieran: están comprobando el nombre de la clase (siempre una cadena) y la clase del codificador, curiosamente, en lugar de la clase del elemento real.
andyvn22
55
Para una comprobación rápida de esto: NSLog(@"Is of type: %@", [element class]); funcionará en iOS 7
Portland Runner
1
@PortlandRunner: Esto es exactamente lo que estaba buscando. IDK si hay un ticket que aborde mejor esa cosa exacta, pero si no, debe crear uno. Si lo haces, házmelo saber y votaré la respuesta allí, ya que este fragmento fue muy bueno para mí. Gracias de nuevo.
Matt Williams
15

Cuando desee diferenciar entre una superclase y la clase heredada, puede usar:

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

El uso - (BOOL)isKindOfClass:(Class)aClassen este caso daría como resultado VERDADERO las dos veces porque la clase heredada también es una especie de superclase.

Yedy
fuente
3
isMemberOfClass:regresará NOcuando se trate de subclases.
mipadi
11

Al ejecutar una prueba simple, pensé en documentar lo que funciona y lo que no. A menudo veo personas que comprueban si la clase del objeto es miembro de la otra clase o si es igual a la otra clase.

Para la siguiente línea, tenemos algunos datos mal formados que pueden ser an NSArray, an NSDictionaryo (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]);
}

isKindOfClassfuncionó bastante bien mientras isMemberOfClassno lo hizo.

Alex Zavatone
fuente
Te veo código compartido para las pruebas. ¿Pero dónde están los resultados impresos?
nuynait
La idea es que copie mi código y vea los resultados de lo que necesita.
Alex Zavatone
9

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

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

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

AMohan
fuente
1
En realidad devolverá un Classobjeto. Sin embargo, el descriptionde este objeto será el nombre de la clase como una cadena, por lo que aún puede iniciar sesión en la consola.
devios1