【问题标题】:Detect class of an object conforming to a protocol?检测符合协议的对象的类?
【发布时间】:2014-05-31 03:05:48
【问题描述】:

我有一系列符合特定协议的类。例如:

@protocol Consumable
@end

几个类之一:

@interface LivingEntity : Entity<Consumable>
...

在应用程序的其他部分,我检查对象是否为conformsToProtocol,并使用:

id<Consumable> consumable = (id<Consumable>) something;

问题是consumable 然后被移交给几个方法。如果consumableLivingEntity 类的实例,则其中之一需要额外的逻辑。

但是,无法检查 [consumable class] == [LivingEntity class] 是否存在。

如何查看是哪个班级?似乎协议强制转换阻止我使用 NSObject 方法。

【问题讨论】:

  • 为什么没有办法检查?您可以将任何您想要的消息发送到id
  • xcode 显示错误,No known instance method for selector 'class'
  • 问题是协议应该从NSObject协议“继承”(是的,有这样的东西),比如@protocol P &lt;NSObject&gt;。那个尖括号部分可能是缺少的。当我在做的时候,你应该看看卡尔关于如何检查班级成员的答案。 == 可能暂时有效,但这不是公认的方式。

标签: ios objective-c


【解决方案1】:

假设所有符合Consumable 的类也符合NSObject 协议,通常意味着它们都来自NSObjectNSProxy,具有Consumable 扩展NSObject,允许您使用-isKindOfClass:-isMemberOfClass: 方法:

@protocol Consumable <NSObject>
...
@end

然后,如果您想检查 LivingEntity 或其任何子类,则可以使用 isKindOfClass: 进行检查,如果您只需要检查 LivingEntity(不包括其子类),则使用 isMemberOfClass:。例如:

if([consumable isKindOfClass:[LivingEntity class]]) {...}

【讨论】:

  • 虽然@carl 的回答应该适合你。如果调用者仍在尝试根据被调用者的类做出决定,那么您真的应该重新考虑协议定义。也许在协议-(bool)needsExtraHandling 中添加一个新方法?虽然希望你能更恰当地命名它。
【解决方案2】:

您应该能够使用 [ClassName conformsToProtocol:@protocol(ProtocolName)] 来检查对象是否符合特定协议。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多