ObjC类对象是否符合协议?

Dou*_*oug 19 syntax protocols class objective-c

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

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

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

something.delegate = (id<SomethingDelegate>)[self class]
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

相关但不同: ObjC:有没有"类协议"这样的东西?

wby*_*ung 19

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

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

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

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

Class<SomethingDelegate> variable = (Class<SomethingDelegate>)[self class];
Run Code Online (Sandbox Code Playgroud)

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

  • 您不需要指针语法.`Class`已经是一个指针(它被定义为`typedef struct objc_class*Class`.如果你需要一个指向类的指针(这可能非常罕见),你只需要它. (5认同)

rob*_*off 7

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

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

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

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