一个ObjC类对象可以符合协议?(Can an ObjC class object conform

2019-07-28 21:06发布

有没有一种方法来指示一个类对象符合协议的编译器?

据我所知,通过创建+(void)foo类方法, 即类对象的一个实例将具有这些方法作为实例方法 。 所以,只要我创建+(void)foo为所有需要的协议方式方法,我可以有一个类对象的行为作为代表。

我当然问题是,在类的头文件,我只知道如何表明该类的实例符合协议(如通常的情况下)。 所以,我已经想通了,最好是投类对象,像这样:

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

有任何想法吗?

相关,但不同的: ObjC:是有这样的事,作为一个“类协议”?

Answer 1:

你现在正在做的是正确的,因为它会沉默警告,这是你的目标。 你将被发送的协议情况下这是一个有点混乱定义的类对象的消息,但运行时并不关心。

想想这样说:你要委托设置为响应在协议中定义的消息的对象。 你的类做到这一点,你的类也是一个对象。 因此,你应该把你的类一样,遵循该协议的对象。 因此,你写的是完全正确的(根据你想要做什么)。

有一点要注意,虽然是这个类将不能正确回应conformsToProtocol: 这通常是没关系的委派安装反正(代表通常不会检查是否符合类 - 他们只是确认是否能来选择响应)。

作为一个侧面说明,有一两件事你可以做的语法是:

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

这里的区别是,编译器将使用类的方法从协议,而不是实例的消息。 这是不是你想要在你的情况是什么,虽然。



Answer 2:

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

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

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

这些都不将消除铸造关闭编译起来的需要。 只需使用一个单例。



文章来源: Can an ObjC class object conform to a protocol?