Come posso verificare se un oggetto è un'istanza di una particolare classe in Objective-C? Diciamo che voglio vedere se l'oggetto a è un'istanza di classe b, o classe c, come posso fare per farlo?
Come posso verificare se un oggetto è un'istanza di una particolare classe in Objective-C? Diciamo che voglio vedere se l'oggetto a è un'istanza di classe b, o classe c, come posso fare per farlo?
Risposte:
Per verificare se l'oggetto è un'istanza di 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.
o
[yourObject isMemberOfClass:[a class]]
// Returns a Boolean value that indicates whether the receiver is an instance of a
// given class.
Per ottenere il nome della classe dell'oggetto è possibile utilizzare la NSStringFromClass
funzione:
NSString *className = NSStringFromClass([yourObject class]);
o funzione c da api runtime obiettivo-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
over NSStringFromClass
? Se non ce n'è nessuno, questa risposta dovrebbe essere adattata.
Puoi anche usare
NSString *className = [[myObject class] description];
su qualsiasi oggetto NSO
Cosa significa isKindOfClass nella documentazione Apple
Prestare attenzione quando si utilizza questo metodo su oggetti rappresentati da un cluster di classi. A causa della natura dei cluster di classe, l'oggetto restituito potrebbe non essere sempre il tipo previsto. Se si chiama un metodo che restituisce un cluster di classe, il tipo esatto restituito dal metodo è l'indicatore migliore di ciò che è possibile fare con quell'oggetto. Ad esempio, se un metodo restituisce un puntatore a un oggetto NSArray, non si dovrebbe usare questo metodo per vedere se l'array è mutabile, come mostrato nel codice seguente:
// DO NOT DO THIS!
if ([myArray isKindOfClass:[NSMutableArray class]])
{
// Modify the object
}
Se usi tali costrutti nel tuo codice, potresti pensare che sia giusto modificare un oggetto che in realtà non dovrebbe essere modificato. Ciò potrebbe quindi creare problemi per altri codici che prevedevano che l'oggetto rimanesse invariato.
-isKindOfClass:
e -isMemberOfClass:
non dovrebbero essere utilizzati per identificare oggetti all'interno di un cluster di classi.
Se si desidera verificare una classe specifica, è possibile utilizzare
if([MyClass class] == [myClassObj class]) {
//your object is instance of MyClass
}
se vuoi ottenere il nome della classe chiama semplicemente: -
id yourObject= [AnotherClass returningObject];
NSString *className=[yourObject className];
NSLog(@"Class name is : %@",className);