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

Jam*_*ore 548 objective-c ios

我需要测试对象是类型NSString还是UIImageView.我怎么能做到这一点?是否有某种类型的"isoftype"方法?

mmc*_*mmc 861

如果你的对象是myObject,并且你想测试它是否是一个NSString,代码将是:

[myObject isKindOfClass:[NSString class]]
Run Code Online (Sandbox Code Playgroud)

同样,如果你想测试myObject一个UIImageView:

[myObject isKindOfClass:[UIImageView class]]
Run Code Online (Sandbox Code Playgroud)

  • 请注意,还有一个isMemberOfClass:方法将检查类"准确性".但要小心,因为许多Apple对象实际上是伪装的Core Foundation类型.(例如,NSString通常是NSCFString,而isMemberOfClass:将为此比较返回false.) (87认同)
  • 注意这个方法很慢! (3认同)

小智 54

你可能会用

- (BOOL)isKindOfClass:(Class)aClass
Run Code Online (Sandbox Code Playgroud)

这是一种方法NSObject.

有关更多信息,请查看NSObject文档.

这就是你如何使用它.

BOOL test = [self isKindOfClass:[SomeClass class]];
Run Code Online (Sandbox Code Playgroud)

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

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");    
}
Run Code Online (Sandbox Code Playgroud)

  • 快速检查一下:`NSLog(@"类型:%@",[元素类]);`将在iOS 7中工作 (5认同)
  • 是的,没有这样的事情 (4认同)
  • -1:不要使用`className`,它可能在OS X上工作,也可能不工作,但它不在iOS中,并不意味着用于此.而且,那些`NSLog不会做我认为你的意思 - 他们正在检查类名(总是一个字符串)和编码器类,奇怪的是,而不是实际元素的类. (4认同)
  • 什么是这个`className`我无法使用我的ID (2认同)
  • @PortlandRunner:这正是我正在寻找的。我不知道是否有一张票可以更好地解决这一问题,但如果没有,您应该创建一张。如果你这样做,我会让我知道,我会在那里投票赞成答案,因为这个片段对我来说很重要。再次感谢。 (2认同)

Yed*_*edy 15

如果想要在superClass和inheritedClass之间有所不同,可以使用:

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

- (BOOL)isKindOfClass:(Class)aClass在这种情况下使用会导致两次都为TRUE,因为inheritedClass也是一种superClass.

  • `isMemberOfClass:`在处理子类时将返回`NO`. (3认同)

Ale*_*one 11

运行一个简单的测试,我想我会记录哪些有效,哪些无效.通常我会看到人们检查对象的类是否是另一个类的成员或者是否等于另一个类.

对于下面的行,我们有一些结构不良的数据,可以是a NSArray,a NSDictionary(null).

NSArray *hits = [[[myXML objectForKey: @"Answer"] objectForKey: @"hits"] objectForKey: @"Hit"];
Run Code Online (Sandbox Code Playgroud)

这些是执行的测试:

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]);
}
Run Code Online (Sandbox Code Playgroud)

isKindOfClass工作得相当好,而isMemberOfClass没有.


Baj*_*jju 8

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

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


AMo*_*han 5

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

  • 实际上它会返回一个“Class”对象。但是,该对象的“描述”将是字符串形式的类名称,因此您仍然可以将其记录到控制台。 (2认同)