【发布时间】:2016-07-02 02:06:30
【问题描述】:
我正在试验协议以及如何使用它们来解耦代码,同时利用使用协议的其他副作用。基本上,我想做的是以下几点:
一个示例可以是按范围分组到协议中的 API 调用的超集(例如“用户 API 调用”和“设置 API 调用”,或“非可变 API 调用”和“可变 API 调用”)。在这种情况下,有兴趣使用A 公开的API 的消费者不一定知道B 和C 的API。
考虑以下模仿上述场景的协议:
protocol A {}
protocol B {}
protocol C {}
然后,给定一组协议[A, B, C],使用工厂类,我想要一个符合这些协议子集的 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() 进行初始化会产生以下错误:
不支持将“A”用作符合协议“A”的具体类型
如果工厂定义为:
class Factory<T where T: A, T: B>
有几件事显然失败了:
-
<T: protocol<A, B, C>>和<T where T: A, T: B>要求返回的对象同时符合A、B和C,而不仅仅是它们的子集。 - 鉴于该错误,似乎甚至不可能“将协议用作符合协议的具体类型”。
简而言之,是否有可能实现我想要的目标?
【问题讨论】: