Это не то, как работают связанные типы.get
должно быть общим для своего типа ответа, но сам сетевой менеджер не является общим для какого-то определенного типа ответа.Я полагаю, что вы имели в виду следующее:
protocol NetworkManager {
func get<ResponseObject>(url: String,
ofType: ResponseObject.Type,
completion: (Result<ResponseObject, Error>) -> Void)
where ResponseObject: Decodable
}
class TrivialNetworkManager: NetworkManager {
func get<ResponseObject>(url: String,
ofType: ResponseObject.Type,
completion: (Result<ResponseObject, Error>) -> Void)
where ResponseObject: Decodable {
completion(.success(SomeObject(id: "1", name: "hello"))
}
}
Для более проработанной версии этой конкретной проблемы вы можете прочитать мою серию протоколов , но важная концепция здесь заключается в том, чтоNetworkManager не отличается от своего ResponseType, поэтому нет причин делать его ResponseType ассоциированным типом.
То, что вы написали, пытается сказать: «Некоторые сетевые менеджеры будут иметь Codable ResponseType, а другие сетевые менеджеры будут иметькакой-то другой тип ResponseType. "Не «какой-то другой конкретный тип ответа (например, Пользователь)», а «некоторый другой протокол, которому должны соответствовать его типы ответа».Хотя возможно создать что-то подобное, это намного сложнее, и вам нужно объяснить ваш конкретный вариант использования, чтобы спроектировать его.В частности, вам нужно показать несколько конкретных реализаций вашего протокола, чтобы увидеть, какой тип общего кода вы пытаетесь извлечь.