繁体   English   中英

ObjC class object 可以符合协议吗?

[英]Can an ObjC class object conform to a protocol?

有没有办法向编译器表明 class object 符合协议?

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

我的问题当然是在班级的 header 文件中,我只知道如何指示 class 的实例符合协议(通常是这种情况)。 所以,我想出的最好办法是像这样投射 class object:

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

有任何想法吗?

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

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

以这种方式思考:您想要将委托设置为 object 以响应协议中定义的消息。 你的 class 就是这样做的,你的 class 也是一个 object。因此,你应该像对待符合该协议的 object 一样对待你的 class。 因此,你写的是完全正确的(基于你正在尝试做的事情)。

不过,需要注意的一件事是 class 不会正确响应 conformsToProtocol conformsToProtocol: 无论如何,这对于委托设置来说通常是可以的(委托通常不检查 class 是否符合——它们只是检查它是否可以响应选择器)。

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM