在Objective-C中,与Java的"instanceof"关键字相对应的是什么?

194

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

someObject instanceof SpecifiedType

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

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

如何在Objective-C中实现这个?


参见:https://dev59.com/wGsy5IYBdhLWcg3w0RXT - Dheeraj Vepakomma
3个回答

275

使用[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
9
可以使用 if ([myObject isMemberOfClass:[MyClass class]]) 进行精确比较。 - user102008

37

来自维基百科

例如,在 Objective-C 中,通用的 Object 和 Cocoa/OpenStep 中的 NSObject 都提供了方法 isMemberOfClass:,如果该方法的参数是指定类的实例,则返回 true。 方法isKindOfClass:同样地,如果参数继承自指定的类,则返回true。

isKindOfClass:听起来最接近于instanceof


9
请参阅NSObject文档中的isKindOfClass:方法。(通常警告这种问题的词是检查对象类通常是做错事的迹象。)

3
为什么使用类类型检查被认为是不好的?这是否是良好的防御性编程,还是你认为这是不必要的? - Dan Rosenstark
1
谢谢。一个问题是对象不一定是你期望的类。在测试期间,通常会传递一个遵守接口但具有不同类的类存根。或者当使用KVO观察值更改时,会对类进行某些魔法操作。这两种情况都是合法的,如果您的代码进行了显式的类检查,则很容易破坏它们。基于类的切换行为是差劲的OO设计,紧密耦合且难以扩展。我并不是说没有合法的类检查用例,但在执行此操作之前,您应该三思而后行。 - zoul
@zoul 在这种情况下,这只是纯粹的经验不足,更有可能使用 + (BOOL)conformsToProtocol:(Protocol *)aProtocol - EricLeaf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接