在Objective-C中,Java的“ instanceof”关键字等效于什么?


185

我想检查一个对象(例如someObject)是否可分配(可广播)到另一种类型的变量(例如SpecifiedType)。在Java中,我可以这样写:

someObject instanceof SpecifiedType

一个相关的问题是查找对象的运行时类型是否等于另一个类型。在Java中,我可以这样写:

someObject.getClass().equals(SpecifiedType.class)

如何在Objective-C中完成?


Answers:


264

尝试[myObject class]返回对象的类。

您可以使用以下方式进行精确比较:

if ([myObject class] == [MyClass class])

但不能直接使用MyClass标识符。

类似地,您可以使用以下命令查找对象是否属于您的类的子类:

if ([myObject isKindOfClass:[AnObject class]])

正如乔恩·斯凯特(Jon Skeet)和祖尔(zoul)所建议的那样。


例如,我将如何检查与“ AnObject”类型的对象的相等性?
Dimitris,

“ if([myObject class] == [AnObject class])””,或由Jon Skeet和zoul建议:“ if([myObject isKindOfClass:[AnObject class]])”
mouviciel

8
确切的比较也可以使用if ([myObject isMemberOfClass:[MyClass class]])
user102008 2011年

37

维基百科

例如,在Objective-C中,泛型ObjectNSObject(在Cocoa / OpenStep中)都提供了方法isMemberOfClass:true如果该方法的参数是指定类的实例,则该方法 将返回。isKindOfClass:如果参数从指定的类继承,则该方法类似地返回true。

isKindOfClass:instanceof听起来最接近。


9

请参阅NSObject文档中的isKindOfClass:方法。(对此类问题的警告通常是,检查对象类通常是做错事的标志。)


2
只需复制下面的“答案”即可:“ @ Zoul-为什么使用类类型检查被认为是不好的?这不是好的防御性编程,还是您认为应该没有必要?”
Dan Rosenstark 2010年

1
啊哈,谢谢。一个问题是对象不必属于您期望的类。在测试过程中,传递接受接口的类存根很普遍,但是具有不同的类。或者,当您使用KVO观察价值变化时,这些类就具有一定的魔力。如果您的代码执行显式的类检查,则这两种情况都是很合法的,并且很容易被破坏。类上的切换行为是不良的OO设计,紧密耦合且难以扩展。我并不是说没有合法的用例来进行类检查,但您应该在进行检查之前三思而后行。
zoul 2010年

@zoul在那种特定情况下,这只是一种简单的经验,更可能会使用+ (BOOL)conformsToProtocol:(Protocol *)aProtocol
EricLeaf 2013年
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.