Eu preciso testar se o objeto é do tipo NSString
ou UIImageView
. Como posso fazer isso? Existe algum tipo de método "isoftype"?
Eu preciso testar se o objeto é do tipo NSString
ou UIImageView
. Como posso fazer isso? Existe algum tipo de método "isoftype"?
Respostas:
Se seu objeto é myObject
e você deseja testar para ver se é um NSString
, o código seria:
[myObject isKindOfClass:[NSString class]]
Da mesma forma, se você quiser testar myObject
um UIImageView
:
[myObject isKindOfClass:[UIImageView class]]
Você provavelmente usaria
- (BOOL)isKindOfClass:(Class)aClass
Este é um método de NSObject
.
Para mais informações, consulte a NSObject
documentação.
É assim que você usa isso.
BOOL test = [self isKindOfClass:[SomeClass class]];
Você também pode tentar fazer algo assim
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
, ele pode ou não funcionar no OS X, mas não está no iOS e não deve ser usado para isso. Além disso, esses NSLog
s não fazem o que eu acho que você pretendia: eles estão verificando o nome da classe (sempre uma string) e a classe do codificador, estranhamente, em vez da classe do elemento real.
NSLog(@"Is of type: %@", [element class]);
vai funcionar no iOS 7
Quando você quiser diferir entre uma superClasse e a herdatedClass, poderá usar:
if([myTestClass class] == [myInheritedClass class]){
NSLog(@"I'm the inheritedClass);
}
if([myTestClass class] == [mySuperClass class]){
NSLog(@"I'm the superClass);
}
A utilização - (BOOL)isKindOfClass:(Class)aClass
neste caso resultaria em TRUE nas duas vezes, porque a herdatedClass também é um tipo da superClasse.
isMemberOfClass:
retornará NO
ao lidar com subclasses.
Ao executar um teste simples, pensei em documentar o que funciona e o que não funciona. Frequentemente, vejo pessoas verificando se a classe do objeto é membro da outra classe ou é igual à outra classe.
Para a linha abaixo, temos alguns dados mal formados que podem ser um NSArray
, um NSDictionary
ou (null)
.
NSArray *hits = [[[myXML objectForKey: @"Answer"] objectForKey: @"hits"] objectForKey: @"Hit"];
Estes são os testes que foram realizados:
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
funcionou muito bem enquanto isMemberOfClass
não.
[object isKindOfClass:[ClassName class]]