gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 08:42:48 24 4
gpt4 key购买 nike

我正在试验协议(protocol)以及如何使用它们来解耦代码,同时利用使用协议(protocol)的其他副作用。基本上,我想做的是:

例如,API 调用的超集可以按范围分组到协议(protocol)中(例如“用户 API 调用”和“设置 API 调用”,或“非变异 API 调用”和“变异 API 调用”)。在这种情况下,消费者有兴趣使用 A 公开的 API不一定了解 B 的 API和 C .

考虑以下模拟上述场景的协议(protocol):

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

然后,给定一组协议(protocol)[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() 初始化产生以下错误:

Using 'A' as a concrete type conforming to protocol 'A' is not supported

如果 Factory 定义为:

class Factory<T where T: A, T: B>

有几件事显然失败了:

  • <T: protocol<A, B, C>><T where T: A, T: B>要求返回的对象同时符合 A , B , 和 C ,而不仅仅是其中的一个子集。
  • 考虑到错误,似乎甚至不可能“将协议(protocol)用作符合协议(protocol)的具体类型”。

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

最佳答案

我会放弃在你的情况下使用泛型,我可能还会考虑协议(protocol)继承。

因此,例如,可变协议(protocol)将从不可变协议(protocol)继承,因为您希望能够访问最少,并且在备用情况下既可以访问又可以更改。

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

继续使用泛型意味着暴露底层的实现类,这就是你的错误的原因。您不能为此使用协议(protocol),因为它不是具体的,它只是一些具体对象将要提供的内容的定义。

关于符合协议(protocol)可变子集的 Swift 泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36031526/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com