No Objective-C, como faço para testar o tipo de objeto?

Respostas:

880

Se seu objeto é myObjecte você deseja testar para ver se é um NSString, o código seria:

[myObject isKindOfClass:[NSString class]]

Da mesma forma, se você quiser testar myObjectum UIImageView:

[myObject isKindOfClass:[UIImageView class]]
mmc
fonte
90
Observe que também há um método isMemberOfClass: que verificará a classe "exatidão". Porém, tenha cuidado com isso, pois muitos objetos da Apple são realmente do tipo Core Foundation disfarçados. (. Por exemplo, um NSString é mais frequentemente um NSCFString e isMemberOfClass: retornará false para esta comparação.)
Craig Otis
3
Note que este método é muito lento!
precisa saber é o seguinte
É certo saber que o NSString é um cluster de classes? (like NSNumber)
Ricardo
52

Você provavelmente usaria

- (BOOL)isKindOfClass:(Class)aClass

Este é um método de NSObject.

Para mais informações, consulte a NSObjectdocumentaçã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");    
}
Bryan Hare
fonte
4
-1: não use 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 NSLogs 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.
precisa saber é o seguinte
5
Para uma verificação rápida este: NSLog(@"Is of type: %@", [element class]); vai funcionar no iOS 7
Portland Runner
1
@PortlandRunner: Era exatamente isso que eu estava procurando. IDK se houver um ticket que lide exatamente com essa coisa exata, mas se não, você deve criar um. Se você o fizer, avise-me e votarei a resposta lá, pois esse trecho foi muito útil para mim. Obrigado novamente.
Matt Williams
15

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)aClassneste caso resultaria em TRUE nas duas vezes, porque a herdatedClass também é um tipo da superClasse.

Yedy
fonte
3
isMemberOfClass:retornará NOao lidar com subclasses.
Mipadi
11

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 NSDictionaryou (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]);
}

isKindOfClassfuncionou muito bem enquanto isMemberOfClassnão.

Alex Zavatone
fonte
Vejo seu código compartilhado para testes. Mas onde está o resultado impresso?
Nuynait 18/07/19
A idéia é que você copie meu código e veja os resultados para o que você precisa.
Alex Zavatone 15/1018
9

Você pode usar o seguinte código, caso queira verificar os tipos de tipos de dados primitivos.

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

Simples, [sua classe de objeto] retornará o nome da classe de seu objeto.

AMohan
fonte
1
Na verdade, ele retornará um Classobjeto. No entanto, descriptionesse objeto será o nome da classe como uma sequência, portanto, você ainda poderá registrá-lo no console.
devios1