Я работаю над проектом, в котором есть сетевой клиент, который в основном следует приведенному ниже шаблону.
protocol EndpointType {
var baseURL: String { get }
}
enum ProfilesAPI {
case fetchProfileForUser(id: String)
}
extension ProfilesAPI: EndpointType {
var baseURL: String {
return "https://foo.bar"
}
}
protocol ClientType: class {
associatedtype T: EndpointType
func request(_ request: T) -> Void
}
class Client<T: EndpointType>: ClientType {
func request(_ request: T) -> Void {
print(request.baseURL)
}
}
let client = Client<ProfilesAPI>()
client.request(.fetchProfileForUser(id: "123"))
В рамках приведения в порядок этого проекта и написания тестов я обнаружил, что невозможно внедрить client
при соответствии протоколу ClientType
.
let client: ClientType = Client<ProfilesAPI>()
выдает ошибку:
ошибка: элемент «запрос» не может использоваться для значения типа протокола «ClientType»; вместо этого используйте общее ограничение
Я хотел бы сохранить текущий шаблон ... = Client<ProfilesAPI>()
Можно ли добиться этого с помощью стирания типа? Я читал, но не уверен, как это сделать.
client
- person Robert Dresler   schedule 11.03.2019Client<RolesAPI>()
и так далее. - person Tim J   schedule 11.03.2019client.request(.fetchProfileForUser(id: "123"))
со значением перечисления в пределахrequest(...)
, установленным с использованием случая из перечисления, которое соответствуетEndpointType
. Это перечисление устанавливается при объявлении экземпляраclient
. - person Tim J   schedule 11.03.2019