Swift泛型类型符合协议的可变子集

时间:2016-03-16 09:30:30

标签: swift generics

我正在试验协议以及它们如何用于解耦代码,同时利用使用协议的其他副作用。基本上,我要做的是以下内容:

示例可以是API调用的超集,按范围分组到协议中(例如"用户API调用"和"设置API调用"或"非改变API调用"和#34;改变API调用")。在这种情况下,对使用A公开的API感兴趣的消费者不一定了解BC的API。

考虑以下模仿上述情况的协议:

protocol A {}
protocol B {}
protocol C {}

然后,给定一组协议[A, B, C],使用Factory类,我想要一个符合其中一部分的API对象的实例:

let a = Factory<A>.create()
let ab = Factory<A, B>.create()
let bc = Factory<B, C>.create()

我尝试了一些实现,例如:

class Factory<T: protocol<A, B, C>> {
    class func create() -> T {
        return ...
    }
}

但是,使用let a = Factory<A>.create()进行初始化会产生以下错误:

  

使用&#39; A&#39;作为符合协议的具体类型&#39; A&#39;不支持

如果Factory定义为:

,则会发生同样的错误
class Factory<T where T: A, T: B>

有些事情显然会失败:

  • <T: protocol<A, B, C>><T where T: A, T: B>要求返回的对象符合ABC,而不仅仅是其中的一部分。
  • 鉴于错误,似乎甚至不可能将协议用作符合协议的具体类型&#34;。

简而言之,是否有可能实现我的目标?

1 个答案:

答案 0 :(得分:0)

我在你的案例中放弃使用泛型,我可能也会考虑协议继承。

因此,例如,可变协议将从不可变协议继承,因为您希望能够在备用情况下以最小的方式访问和访问和更改。

协议的目的是从底层实现类中抽象出来。在你的例子中,泛型并没有真正增加那种力量。您的工厂(或工厂)可以简单地提供许多创建方法,这些方法返回符合各种协议的对象。

继续使用泛型意味着公开底层实现类,这就是导致错误的原因。你不能使用协议,因为它不具体,它只是一些具体对象将要提供的定义。