如何将符合协议的类声明为参数类型?

Posted

技术标签:

【中文标题】如何将符合协议的类声明为参数类型?【英文标题】:How to declare a class that conforms to a protocol as parameter type? 【发布时间】:2011-10-26 12:55:42 【问题描述】:

有没有办法给一个符合特定协议的类作为参数?

起初我怀着一点希望尝试的是这样的:

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

但这会导致

[aClass superclass];

给出警告“找到实例方法'超类'而不是类方法'超类'”。我收到了同样的 conformsToProtocol 警告:。

因为当参数是 (Class)aClass 时它没有给出这样的警告,看来 Class 实际上不是 Class 类型。

我不应该发送 NSObject,因为我需要根据类及其超类来确定正确的键,并且只有在尚未为该键设置任何内容的情况下才创建和添加新对象。

我可以使用 conformsToProtocol 进行检查,但是我必须返回一个零值,这只是乱七八糟的。我宁愿在编译时停止这个问题。

那么简而言之,是否存在符合协议的类的类型声明?

【问题讨论】:

我有一个类可以接收改变其行为的扩展。它将其扩展存储在字典中,键取决于类。它不知道哪些类可以扩展它。关键是实现协议的最顶层超类,这样一个类和它的超类就不会做同样的事情,所以其他类也可以询问它是否有某个扩展,而不必知道该扩展类的所有子类.我已经准备好了,除了方法签名,如果给定的类没有实现协议,它现在强制我返回 nil。 注意:我好久没用Objective-C了。我不再寻找这个问题的答案,也没有资格判断和接受任何答案。我认为这个问题目前属于社区投票。 【参考方案1】:

您可以只对您的类对象进行类型转换以防止编译器警告。我能够做到以下几点:

- (void)tempMethod:(Class<NSObject>)klass 
   id a = [(Class)klass superclass];
    NSLog(@"%@", a);

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

【讨论】:

以上是关于如何将符合协议的类声明为参数类型?的主要内容,如果未能解决你的问题,请参考以下文章

在 swift 中使用协议作为数组类型和函数参数

无法将协议的通用关联类型的值转换为预期的参数类型

协议作为 swift 冲突中的参数类型

如何将使用参数包和类型名的类作为函数的输入参数(c++)

快速返回特殊类型的通用协议的方法

参数类型“customClass.Type”不符合预期类型“NSItemProviderWriting”