ObjC类对象是否符合协议?

时间:2012-04-09 02:58:13

标签: objective-c class syntax protocols

有没有办法向编译器表明类对象符合协议?

据我了解,通过创建+(void)foo类方法,该类对象的实例将这些方法作为实例方法。因此,只要我为所有必需的协议方法创建+(void)foo方法,我就可以让一个类对象充当委托。

我的问题当然是在类的头文件中,我只知道如何指示类的实例符合协议(通常就是这种情况)。所以,我发现最好的是像这样强制转换类对象:

something.delegate = (id<SomethingDelegate>)[self class]

有什么想法吗?

相关,但不同: ObjC: is there such a thing as a "class protocol"?

2 个答案:

答案 0 :(得分:19)

你现在正在做的是正确的,因为它会使你的目标沉默警告。您将发送协议中定义的类对象消息,这些消息有点令人困惑,但运行时并不关心。

以这种方式思考:您希望将委托设置为响应协议中定义的消息的对象。你的班级做了这个,你的班级也是一个对象。因此,您应该将您的类视为符合该协议的对象。因此,你所写的内容是完全正确的(基于你想要做的事情)。

但有一点需要注意的是,此课程无法正确回复conformsToProtocol:。这通常适用于委托设置(委托通常不会检查类是否符合 - 他们只是检查它是否可以响应选择器)。

作为旁注,你可以在句法上做的一件事是:

Class<SomethingDelegate> variable = (Class<SomethingDelegate>)[self class];

这里的不同之处在于编译器将使用协议中的类方法而不是实例消息。不过,这不是你想要的。

答案 1 :(得分:7)

没有Objective-C语法来指示元类符合协议。

我认为你可以在运行时通过在元类上使用class_addProtocol来完成它。但我还没试过。

我想你也可以在课堂上写一个+conformsToProtocol:方法,并说谎你的一致性。这可能会产生意想不到的副作用,因为+conformsToProtocol:上已有NSObject(除-conformsToProtocol:之外)。

这些都不会消除编译器关闭编译器的需要。只需使用单身人士。