Devo verificare se l'oggetto è di tipo NSString
o UIImageView
. Come posso farlo? Esiste un tipo di metodo "isoftype"?
Devo verificare se l'oggetto è di tipo NSString
o UIImageView
. Come posso farlo? Esiste un tipo di metodo "isoftype"?
Risposte:
Se il tuo oggetto è myObject
, e vuoi testare per vedere se è un NSString
, il codice sarebbe:
[myObject isKindOfClass:[NSString class]]
Allo stesso modo, se si desidera provare myObject
per un UIImageView
:
[myObject isKindOfClass:[UIImageView class]]
Probabilmente useresti
- (BOOL)isKindOfClass:(Class)aClass
Questo è un metodo di NSObject
.
Per maggiori informazioni consulta la NSObject
documentazione.
Questo è come lo usi.
BOOL test = [self isKindOfClass:[SomeClass class]];
Potresti anche provare a fare qualcosa del genere
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
, potrebbe funzionare o meno su OS X, ma non è in iOS e non è destinato a questo scopo. Inoltre, quelli NSLog
non fanno quello che penso tu intendessi dire loro - stanno controllando il nome della classe (sempre una stringa) e la classe del codificatore, stranamente, invece della classe dell'elemento reale.
NSLog(@"Is of type: %@", [element class]);
funzionerà su iOS 7
Quando vuoi differenziare tra una superClass e la ereditedClass puoi usare:
if([myTestClass class] == [myInheritedClass class]){
NSLog(@"I'm the inheritedClass);
}
if([myTestClass class] == [mySuperClass class]){
NSLog(@"I'm the superClass);
}
L'utilizzo - (BOOL)isKindOfClass:(Class)aClass
in questo caso comporterebbe VERO entrambe le volte perché anche la ereditedClass è una specie di superClass.
isMemberOfClass:
tornerà NO
quando si ha a che fare con le sottoclassi.
Eseguendo un semplice test, ho pensato di documentare cosa funziona e cosa no. Spesso vedo persone che controllano per vedere se la classe dell'oggetto è un membro dell'altra classe o è uguale all'altra classe.
Per la riga seguente, abbiamo alcuni dati scarsamente formati che possono essere un NSArray
, un NSDictionary
o (null)
.
NSArray *hits = [[[myXML objectForKey: @"Answer"] objectForKey: @"hits"] objectForKey: @"Hit"];
Questi sono i test che sono stati eseguiti:
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
ha funzionato piuttosto bene mentre isMemberOfClass
non lo ha fatto.
[object isKindOfClass:[ClassName class]]