Como testar se um objeto é uma instância de uma classe específica no Objective-C? Digamos que eu queira ver se o objeto a é uma instância da classe b ou classe c, como faço para fazê-lo?
Como testar se um objeto é uma instância de uma classe específica no Objective-C? Digamos que eu queira ver se o objeto a é uma instância da classe b ou classe c, como faço para fazê-lo?
Respostas:
Para testar se o objeto é uma instância da classe a:
[yourObject isKindOfClass:[a class]]
// Returns a Boolean value that indicates whether the receiver is an instance of
// given class or an instance of any class that inherits from that class.
ou
[yourObject isMemberOfClass:[a class]]
// Returns a Boolean value that indicates whether the receiver is an instance of a
// given class.
Para obter o nome da classe do objeto, você pode usar a NSStringFromClass
função:
NSString *className = NSStringFromClass([yourObject class]);
ou função c da API de tempo de execução da objetiva-c:
#import <objc/runtime.h>
/* ... */
const char* className = class_getName([yourObject class]);
NSLog(@"yourObject is a: %s", className);
EDIT: In Swift
if touch.view is UIPickerView {
// touch.view is of type UIPickerView
}
class_getName
mais NSStringFromClass
? Se não houver, essa resposta deve ser ajustada.
Você também pode usar
NSString *className = [[myObject class] description];
em qualquer NSObject
O que significa isKindOfClass na documentação da Apple
Tenha cuidado ao usar esse método em objetos representados por um cluster de classes. Devido à natureza dos clusters de classe, o objeto que você recebe nem sempre pode ser o tipo esperado. Se você chamar um método que retorna um cluster de classes, o tipo exato retornado pelo método é o melhor indicador do que você pode fazer com esse objeto. Por exemplo, se um método retornar um ponteiro para um objeto NSArray, você não deve usar esse método para verificar se a matriz é mutável, conforme mostrado no código a seguir:
// DO NOT DO THIS!
if ([myArray isKindOfClass:[NSMutableArray class]])
{
// Modify the object
}
Se você usar essas construções em seu código, poderá pensar que é correto modificar um objeto que, na realidade, não deve ser modificado. Isso pode criar problemas para outro código que espera que o objeto permaneça inalterado.
-isKindOfClass:
& -isMemberOfClass:
não deve ser usado para identificar objetos em um cluster de classes.
Se você deseja procurar uma classe específica, pode usar
if([MyClass class] == [myClassObj class]) {
//your object is instance of MyClass
}
se você deseja obter o nome da classe, basta ligar para: -
id yourObject= [AnotherClass returningObject];
NSString *className=[yourObject className];
NSLog(@"Class name is : %@",className);