有没有办法向编译器表明类对象符合协议?
据我了解,通过创建+(void)foo
类方法,该类对象的实例将这些方法作为实例方法。因此,只要我为所有必需的协议方法创建+(void)foo
方法,我就可以让一个类对象充当委托。
我的问题当然是在类的头文件中,我只知道如何指示类的实例符合协议(通常就是这种情况)。所以,我发现最好的是像这样强制转换类对象:
something.delegate = (id<SomethingDelegate>)[self class]
有什么想法吗?
答案 0 :(得分:19)
你现在正在做的是正确的,因为它会使你的目标沉默警告。您将发送协议中定义的类对象消息,这些消息有点令人困惑,但运行时并不关心。
以这种方式思考:您希望将委托设置为响应协议中定义的消息的对象。你的班级做了这个,你的班级也是一个对象。因此,您应该将您的类视为符合该协议的对象。因此,你所写的内容是完全正确的(基于你想要做的事情)。
但有一点需要注意的是,此课程无法正确回复conformsToProtocol:
。这通常适用于委托设置(委托通常不会检查类是否符合 - 他们只是检查它是否可以响应选择器)。
作为旁注,你可以在句法上做的一件事是:
Class<SomethingDelegate> variable = (Class<SomethingDelegate>)[self class];
这里的不同之处在于编译器将使用协议中的类方法而不是实例消息。不过,这不是你想要的。
答案 1 :(得分:7)
没有Objective-C语法来指示元类符合协议。
我认为你可以在运行时通过在元类上使用class_addProtocol
来完成它。但我还没试过。
我想你也可以在课堂上写一个+conformsToProtocol:
方法,并说谎你的一致性。这可能会产生意想不到的副作用,因为+conformsToProtocol:
上已有NSObject
(除-conformsToProtocol:
之外)。
这些都不会消除编译器关闭编译器的需要。只需使用单身人士。