Я пытался создать универсальный метод, который принимает 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
, так как я использую URLSessions
s .dataTaskPublisher
(.decode(...)
).