19

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

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

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

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

有任何想法吗?

相关但不同: ObjC:是否有“类协议”之类的东西?

4

2 回答 2

19

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

这样想:你想为一个响应协议中定义的消息的对象设置一个委托。你的班级这样做,你的班级也是一个对象。因此,您应该将您的类视为符合该协议的对象。因此,您所写的内容是完全正确的(基于您要执行的操作)。

但是,需要注意的一点是,此类将无法正确响应conformsToProtocol:. 无论如何,这对于委托设置通常是可以的(委托通常不检查类是否符合 - 他们只是检查它是否可以响应选择器)。

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

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

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

于 2012-04-09T15:18:15.450 回答
7

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

我认为你可以在运行时通过class_addProtocol在元类上使用来做到这一点。但我还没有尝试过。

我猜你也可以+conformsToProtocol:在你的类上写一个方法,然后对你的一致性撒谎。这可能会产生意想不到的副作用,因为已经有一个+conformsToProtocol:on NSObject(除了-conformsToProtocol:)。

这些都不会消除强制转换来关闭编译器的需要。只需使用单例。

于 2012-04-09T03:02:48.503 回答