Necesito probar si el objeto es de tipo NSString
o UIImageView
. ¿Cómo puedo lograr esto? ¿Hay algún tipo de método "isoftype"?
Necesito probar si el objeto es de tipo NSString
o UIImageView
. ¿Cómo puedo lograr esto? ¿Hay algún tipo de método "isoftype"?
Respuestas:
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 myObject
para UIImageView
:
[myObject isKindOfClass:[UIImageView class]]
Probablemente usarías
- (BOOL)isKindOfClass:(Class)aClass
Este es un método de NSObject
.
Para más información consulte la NSObject
documentació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");
}
className
, puede o no funcionar en OS X, pero no está en iOS y no debe usarse para esto. Además, esos NSLog
no 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.
NSLog(@"Is of type: %@", [element class]);
funcionará en iOS 7
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)aClass
en este caso daría como resultado VERDADERO las dos veces porque la clase heredada también es una especie de superclase.
isMemberOfClass:
regresará NO
cuando se trate de subclases.
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 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.
[object isKindOfClass:[ClassName class]]