Objective-C'de nesne türünü nasıl test edebilirim?


Yanıtlar:


880

Nesneniz myObjectve eğer bir olup olmadığını test etmek istiyorsanız NSString, kod şöyle olacaktır:

[myObject isKindOfClass:[NSString class]]

Aynı şekilde, test etmek istiyorsa myObjectbir için UIImageView:

[myObject isKindOfClass:[UIImageView class]]

90
Ayrıca "kesinlik" sınıfını denetleyecek bir isMemberOfClass: yöntemi bulunduğunu unutmayın. Yine de dikkatli olun, çünkü birçok Apple nesnesi aslında Core Foundation türlerini gizlemiştir. (Örneğin, bir NSString genellikle bir NSCFString'dir ve isMemberOfClass: bu karşılaştırma için yanlış döndürür.)
Craig Otis

3
Bu yöntemin çok yavaş olduğunu unutmayın!
SAKrisT

NSString'in bir sınıf kümesi olduğunu bilmek doğru mu? (NSNumber gibi)
Ricardo

52

Muhtemelen kullanırdın

- (BOOL)isKindOfClass:(Class)aClass

Bu bir yöntemdir NSObject.

Daha fazla bilgi için NSObjectbelgelere bakın.

Bunu böyle kullanıyorsunuz.

BOOL test = [self isKindOfClass:[SomeClass class]];

Ayrıca böyle bir şey yapmayı deneyebilirsiniz

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");    
}

4
-1: Kullanmayın className, OS X üzerinde çalışabilir veya çalışmayabilir, ancak iOS'ta değildir ve bunun için kullanılması amaçlanmamıştır. Ayrıca, bu NSLogne demek istediğini sanmıyorum - onlar sınıf adını (her zaman bir dize) ve coder sınıf, garip bir şekilde, gerçek öğenin sınıfı yerine kontrol ediyorlar.
andyvn22

5
Hızlı bir kontrol için: NSLog(@"Is of type: %@", [element class]); iOS 7'de çalışacak
Portland Runner

1
@PortlandRunner: Tam da aradığım şey buydu. IDK, o şeyi daha iyi ele alan bir bilet varsa, ancak değilse, bir tane oluşturmalısınız. Eğer yaparsan, bana haber verdim ve bu pasaj benim için debriyaj olduğu için cevabı oradan kaldıracağım. Tekrar teşekkürler.
Matt Williams

15

Bir superClass ve inheritedClass arasında ayrım yapmak istediğinizde şunları kullanabilirsiniz:

if([myTestClass class] == [myInheritedClass class]){
   NSLog(@"I'm the inheritedClass);
} 
if([myTestClass class] == [mySuperClass class]){
   NSLog(@"I'm the superClass);
} 

Kullanılması - (BOOL)isKindOfClass:(Class)aClassinheritedClass da üst sınıf bir tür olduğu için bu durumda DOĞRU hem zamanları anlamına gelir.


3
isMemberOfClass:NOalt sınıflarla uğraşırken geri dönecektir .
mipadi

11

Basit bir test yaparak neyin işe yarayıp neyin yaramadığını belgelediğimi düşündüm. Genellikle nesnenin sınıfının diğer sınıfın üyesi olup olmadığını veya diğer sınıfa eşit olup olmadığını kontrol eden insanlar görürüm.

Aşağıdaki satır için, bir NSArray, bir NSDictionaryveya olabilen zayıf biçimlendirilmiş verilerimiz var (null).

NSArray *hits = [[[myXML objectForKey: @"Answer"] objectForKey: @"hits"] objectForKey: @"Hit"];

Bunlar yapılan testlerdir:

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

isKindOfClassama çok iyi çalıştı isMemberOfClass.


Testler için kod paylaştığınızı görüyorum. Fakat yazdırılan sonuç nerede?
nuynait

Fikir, kodumu kopyalamanız ve ihtiyacınız olan şeylerin sonuçlarını görmeniz.
Alex Zavatone

9

İlkel veri türlerinin türlerini denetlemek istediğinizde aşağıdaki koddan yararlanabilirsiniz.

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

5

Basit, [yourobject sınıfı] yourobject sınıf adını döndürür.


1
Aslında bir Classnesne döndürür . Ancak, descriptionbu nesnenin dize olarak sınıf adı olacaktır, bu nedenle yine de konsola kaydedebilirsiniz.
devios1
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.