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


Necesito probar si el objeto es de tipo NSString o UIImageView. ¿Cómo puedo lograr esto? ¿Hay algún tipo de método "isoftype"?


515
2017-07-17 17:19


origen


Respuestas:


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

[myObject isKindOfClass:[NSString class]]

Del mismo modo, si quisiera probar myObject para UIImageView:

[myObject isKindOfClass:[UIImageView class]]

826
2017-07-17 17:28



Probablemente usarías

- (BOOL)isKindOfClass:(Class)aClass

Este es un método de NSObject.

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

Así es como usas esto.

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

También puedes 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");    
}

53
2017-07-17 17:33



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);
} 

Utilizando - (BOOL)isKindOfClass:(Class)aClass en este caso resultaría VERDADERO en ambas ocasiones porque heredadoClase también es una especie de superclase.


12
2017-08-13 11:38



Ejecutando una prueba simple, pensé que documentaría lo que funciona y lo que no funciona. 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 pobremente formados que pueden ser NSArray, un 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 isMemberOfClass no lo hizo.


11
2017-10-08 21:46



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

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

6
2018-05-08 08:27



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


4
2018-05-14 13:44