我想实现一个接受某种类类型的Swift方法,但只接受那些符合特定协议的类的实例 . 例如,在Objective-C中我有这样的方法:
- (void)addFilter:(GPUImageOutput<GPUImageInput> *)newFilter;
其中 GPUImageOutput
是特定类, GPUImageInput
是协议 . 只有符合此协议的 GPUImageOutput
类才是此方法的可接受输入 .
但是,上面的自动Swift生成的版本是
func addFilter(newFilter: GPUImageOutput!)
这消除了 GPUImageOutput
类符合 GPUImageInput
协议的要求,这将允许传入不兼容的对象(然后在运行时崩溃) . 当我尝试将其定义为 GPUImageOutput<GPUImageInput>
时,编译器会抛出错误
不能专门化非泛型类型'GPUImageOutput'
我如何在Swift中的参数中进行这样的类和协议专门化?
2 回答
你必须迅速使用泛型,这样:
给出这些协议,主类和子类的示例声明:
现在,您要定义一个方法,该方法接受符合协议ExampleProtocol的ATestClass类型(或子类)的输入参数 . 像这样编写方法声明:
你的方法,在swift中重新定义,应该是
编辑:
作为你的最后一条评论,一个关于Enum的泛型的例子
专注于协议一致性:
编辑^ 2:
你甚至可以使用实例变量来使用泛型:
假设您有一个类和一个实例变量,您希望此实例变量仅采用
ATestClass
类型的值并且符合ExampleProtocol
然后以这种方式实例化它:
如果
child
不符合协议ExampleProtocol
,则无法编译来自ObjC的这个方法 Headers :
与Swift中的此 Headers 相同:
两种方法都会接受同一组类
基于
GPUImageOutput
类;和符合
GPUImageInput
协议;和newFilter
是可选的,它可以是nil
;