在Objective-C中,如何测试对象类型?


Answers:


880

如果您的对象是myObject,并且要测试以查看它是否是NSString,则代码将是:

[myObject isKindOfClass:[NSString class]]

同样,如果你想考myObjectUIImageView

[myObject isKindOfClass:[UIImageView class]]

90
请注意,还有一个isMemberOfClass:方法将检查类“ exactness”。但是要小心,因为许多Apple对象实际上是伪装的Core Foundation类型。(例如,NSString通常是NSCFString,并且isMemberOfClass:对于此比较将返回false。)
Craig Otis

3
注意此方法非常慢!
SAKrisT

知道NSString是一个类集群,对吗?(例如NSNumber)
里卡多

52

您可能会使用

- (BOOL)isKindOfClass:(Class)aClass

这是一种方法NSObject

有关更多信息,请查阅NSObject文档。

这就是您的用法。

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

您也可以尝试做这样的事情

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:请勿使用className,它可能会在OS X上运行,也可能无法在OS X上运行,但它不在iOS中,并且不打算用于此目的。而且,这些功能NSLog并没有按照我想您的意思执行—它们奇怪地是在检查类名称(始终是字符串)和编码器类,而不是实际元素的类。
andyvn22 2013年

5
快速检查:NSLog(@"Is of type: %@", [element class]); 适用于iOS 7
Portland Runner

1
@PortlandRunner:这正是我想要的。IDK(如果有票证)可以更好地解决该问题,但如果没有,则应创建一个票证。如果您愿意,我会让我知道,我会在那儿回答答案,因为这段代码对我来说至关重要。再次感谢。
马特·威廉姆斯

15

如果要在超类和继承的类之间进行区分,可以使用:

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

- (BOOL)isKindOfClass:(Class)aClass在这种情况下使用将导致两次都为TRUE,因为InheritedClass也是超类的一种。


3
isMemberOfClass:NO在处理子类时将返回。
mipadi

11

运行一个简单的测试,我以为我要记录什么有效,什么无效。我经常看到人们在检查该对象的类是否是另一个类的成员或等于另一个类。

对于下面的行,我们有一些格式不正确的数据,可以是NSArrayNSDictionary(null)

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

这些是执行的测试:

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工作得很好,而isMemberOfClass没有。


我看到您共享测试代码。但是打印结果在哪里?
nuynait

这个想法是让您复制我的代码并查看所需结果的。
亚历克斯·扎瓦通

9

如果要检查原始数据类型的类型,可以使用以下代码。

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

5

很简单,[您的对象类]它将返回您的对象的类名称。


1
实际上它将返回一个Class对象。但是,description此对象的将作为字符串的类名称,因此您仍然可以将其记录到控制台。
devios1 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.