【发布时间】:2019-10-22 06:51:16
【问题描述】:
我尝试创建一个通用方法,该方法接受 TopLevelEncoder 和 TopLevelDecoder 以使其可注入(例如,JSONEncoder 用于生产代码,CustomEncoder 用于测试)。由于这两个协议都有关联的类型,我限制了它们的类型,而不仅仅是做encoder: TopLevelEncoder = JSONEncoder()。我想出了这个方法:
func test<Encoder, Decoder>(
encoder: Encoder = JSONEncoder(),
decoder: Decoder = JSONDecoder()
) where Encoder: TopLevelEncoder, Decoder: TopLevelDecoder {
//encode and decode
}
编译器给了我以下错误信息:Default argument value of type 'JSONEncoder' cannot be converted to type 'Encoder'。我不明白它为什么不能转换为Encoder 类型,因为JSONEncoder 继承自TopLevelEncoder。
我可能误解了泛型和associatedType 的工作原理,但我也无法理解这个错误消息。有人可以帮帮我吗?
我已经看到了解决这个问题的其他方法,比如创建一个新协议,如 AnyEncoder 并用它扩展 JSONEncoder。但在我看来,使用现有协议会更干净。我的方法也需要TopLevelDecoder,因为我使用的是URLSessionss .dataTaskPublisher (.decode(...))。
【问题讨论】:
-
@Kamran 代码在组合框架中
-
目前不可能有泛型的默认值,使用自定义协议。 github.com/apple/swift/blob/master/docs/…
标签: swift generics dependency-injection combine