我正在试验协议以及它们如何用于解耦代码,同时利用使用协议的其他副作用。基本上,我要做的是以下内容:
示例可以是API调用的超集,按范围分组到协议中(例如"用户API调用"和"设置API调用"或"非改变API调用"和#34;改变API调用")。在这种情况下,对使用A
公开的API感兴趣的消费者不一定了解B
和C
的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>
要求返回的对象符合A
,B
和C
,而不仅仅是其中的一部分。简而言之,是否有可能实现我的目标?
答案 0 :(得分:0)
我在你的案例中放弃使用泛型,我可能也会考虑协议继承。
因此,例如,可变协议将从不可变协议继承,因为您希望能够在备用情况下以最小的方式访问和访问和更改。
协议的目的是从底层实现类中抽象出来。在你的例子中,泛型并没有真正增加那种力量。您的工厂(或工厂)可以简单地提供许多创建方法,这些方法返回符合各种协议的对象。
继续使用泛型意味着公开底层实现类,这就是导致错误的原因。你不能使用协议,因为它不具体,它只是一些具体对象将要提供的定义。