【问题标题】:In Objective-C, what is the equivalent of Java's "instanceof" keyword?在 Objective-C 中,Java 的“instanceof”关键字等价于什么?
【发布时间】:2010-10-06 21:20:27
【问题描述】:

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

someObject instanceof SpecifiedType

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

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

如何在 Objective-C 中做到这一点?

【问题讨论】:

标签: objective-c types casting equality downcast


【解决方案1】:

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

您可以进行准确的比较:

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

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

类似地,您可以通过以下方式确定对象是否属于您的类的子类:

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

按照 Jon Skeet 和 zoul 的建议。

【讨论】:

  • 例如,我如何检查与“AnObject”类型的对象是否相等?
  • "if ([myObject class] == [AnObject class])" 或者,按照 Jon Skeet 和 zoul 的建议:"if ([myObject isKindOfClass:[AnObject class]])"
  • 精确比较也可以用if ([myObject isMemberOfClass:[MyClass class]])
【解决方案2】:

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

【讨论】:

  • 只是从下面的“答案”中复制:“@Zoul - 为什么使用类类型检查被认为不好?这不是好的防御性编程还是你认为它应该是不必要的?”
  • 啊哈,谢谢。一个问题是对象不必属于您所期望的类。在测试期间,传递一个尊重接口但具有不同类的类存根是很常见的。或者,当您使用 KVO 观察值变化时,这些类具有一定的魔力。这两种情况都非常合法,如果您的代码进行明确的类检查,两者都很容易被破坏。类的切换行为是糟糕的 OO 设计,紧密耦合且难以扩展。我并不是说没有用于类检查的合法用例,但你应该在做之前三思而后行。
  • @zoul 在这种特定情况下,这只是缺乏经验,更可能使用+ (BOOL)conformsToProtocol:(Protocol *)aProtocol
【解决方案3】:

来自Wikipedia

例如,在 Objective-C 中, 通用 ObjectNSObject(在 Cocoa/OpenStep) 提供方法 isMemberOfClass: 如果返回 true 该方法的参数是 指定类的实例。这 方法isKindOfClass:类似 如果参数继承,则返回 true 来自指定的类。

isKindOfClass: 听起来最接近instanceof

【讨论】:

    猜你喜欢
    • 2010-10-04
    • 2011-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-21
    • 2014-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多