我如何指定一个非generics的Swifttypes应该遵守协议?
我想实现一个Swift方法,它接受某个类的types,但只接受那些符合特定协议的类的实例。 例如,在Objective-C中我有这样的方法:
- (void)addFilter:(GPUImageOutput<GPUImageInput> *)newFilter;  其中GPUImageOutput是一个特定的类, GPUImageInput是一个协议。 只有符合此协议的GPUImageOutput类才是此方法的可接受input。 
但是,上面的自动Swift生成版本是
 func addFilter(newFilter: GPUImageOutput!) 
 这消除了GPUImageOutput类遵循GPUImageInput协议的要求,该协议将允许传入不合规的对象(然后在运行时崩溃)。 当我试图将其定义为GPUImageOutput<GPUImageInput> ,编译器会引发错误 
无法专门化非genericstypes“GPUImageOutput”
我将如何在Swift中的参数中进行这样的类和协议专门化?
迅速您必须使用generics,这样:
给定这些协议,主类和子类的例子声明:
 protocol ExampleProtocol { func printTest() // classes that implements this protocol must have this method } // an empty test class class ATestClass { } // a child class that implements the protocol class ATestClassChild : ATestClass, ExampleProtocol { func printTest() { println("hello") } } 
现在,您要定义一个方法,该方法接受符合协议ExampleProtocol的ATestClasstypes(或子types)的input参数。 写这样的方法声明:
 func addFilter<T where T: ATestClass, T: ExampleProtocol>(newFilter: T) { println(newFilter) } 
你的方法,迅速重新定义,应该是
 func addFilter<T where T:GPUImageOutput, T:GPUImageInput>(newFilter:T!) { // ... } 
编辑:
作为你最后的评论,在generics的一个例子
  enum OptionalValue<T> { case None case Some(T) } var possibleInteger: OptionalValue<Int> = .None possibleInteger = .Some(100) 
专门协议一致性:
  enum OptionalValue<T where T:GPUImageOutput, T:GPUImageInput> { case None case Some(T) } 
编辑^ 2:
即使使用实例variables也可以使用generics:
 假设你有一个类和一个实例variables,你希望这个实例variables只接受ATestClasstypes的值,并且符合ExampleProtocol 
 class GiveMeAGeneric<T: ATestClass where T: ExampleProtocol> { var aGenericVar : T? } 
然后以这种方式实例化它:
  var child = ATestClassChild() let aGen = GiveMeAGeneric<ATestClassChild>() aGen.aGenericVar = child 
 如果child不符合协议ExampleProtocol ,它将不会编译 
来自ObjC的这个方法头:
 - (void)addFilter:(GPUImageOutput<GPUImageInput> *)newFilter { ... } 
和Swift中的这个头文件是一样的:
 func addFilter<T: GPUImageOutput where T: GPUImageInput>(newFilter: T?) { ... } 
两种方法都会接受相同的一组类
-  它基于GPUImageOutput类; 和
-  符合GPUImageInput协议; 和
-   newFilter是可选的,可以是nil;