如何声明一个符合协议的类作为参数类型?

6

有没有一种方法可以将符合某个协议的类作为参数传递?

起初,我尝试了以下代码:

-(NSString *) getKeyForMyProtocolClass(Class<MyProtocol>)aClass

但这会导致...
[aClass superclass];

出现了警告“找到实例方法'superclass'而不是类方法'superclass'”。对于conformsToProtocol:,我也得到了同样类型的警告。

当参数为(Class)aClass时,它不会给出这样的警告,因此Class< MyProtocol>似乎并不是Class类型。

我不应该发送NSObject< MyProtocol>,因为我需要根据类及其超类确定正确的键,并且只有在该键尚未设置任何值时才创建并添加新对象。

我可以使用conformsToProtocol进行检查,但然后我必须返回nil值,这很混乱。我更喜欢在编译时解决问题。

因此,简而言之,是否有一种类类型声明符合协议?


我有一个类,可以接收改变其行为的扩展。它将其扩展存储在字典中,键取决于类。它不知道哪些类可以扩展它。键是实现协议的最顶层的超类,这样一个类及其超类就不会做同样的事情,也可以让其他类询问是否具有某个扩展,而无需知道该扩展类的所有子类。我已经把它都准备好了,除了方法签名,如果给定的类没有实现协议,现在强制我返回nil。 - Aberrant
注意:我已经很久没有使用Objective-C了。我不再寻找这个问题的答案,也不觉得自己有资格评判和接受任何答案。我认为这个问题现在应该由社区投票决定。 - Aberrant
1个回答

1
你可以将类对象强制转换以防止编译器警告。我能够做到以下操作:
- (void)tempMethod:(Class<NSObject>)klass {
   id a = [(Class)klass superclass];
    NSLog(@"%@", a);
}

既然你知道所传递的对象(Class object)的类型,那么这应该可以正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接