#ios #swift #generics #swift-protocols
#iOS #swift #общие #swift-протоколы
Вопрос:
Я понимаю, что эти вопросы задавались много раз, однако я изо всех сил пытаюсь понять, как это можно отнести к моему сценарию.
Я надеюсь, что кто-нибудь сможет разобрать это для меня, чтобы я мог понять проблему и как исправить.
У меня есть протокол
protocol HTTPClientProtocol: class {
associatedtype T: EndpointProtocol
associatedtype U: Codable
var task: URLSessionDataTask { get set }
var session: SessionProtocol { get }
var request: URLRequest? { get }
func call(method: HTTPMethod, endpoint: T, urlParams: [String: String], bodyParams: [String: String], queryParams: [String: String]) -> Promise<U>
.......
}
И класс, который я использую
class HTTPClient<T: EndpointProtocol, U: Codable>: HTTPClientProtocol {
var task: URLSessionDataTask = URLSessionDataTask()
var session: SessionProtocol = URLSession.shared
var request: URLRequest?
func call(method: HTTPMethod, endpoint: T, urlParams: [String: String], bodyParams: [String: String], queryParams: [String: String]) -> Promise<U> {
return Promise<U> { seal in
request = try? createRequest(
service: endpoint.service,
path: createRoute(path: endpoint.path, urlParams: urlParams),
bodyParams: bodyParams,
queryParams: queryParams,
isFastPatch: method == .JSONPATCH
)
.......
}
Я пытаюсь создать это следующим образом
struct RecognitionService: RecognitionServiceProtocol {
lazy var httpClient: HTTPClientProtocol = HTTPClient<FeedsEndpoint, Recognition>()
}
Но я получаю сообщение об ошибке
Протокол HTTPClientProtocol может использоваться только как общее ограничение, поскольку у него есть требования к собственному или связанному типу
Является ли единственным решением сделать call
функцию универсальной вместо класса?
Я не уверен, как исправить эту проблему.
Ответ №1:
Попробуйте
func call<T: EndpointProtocol>(method: HTTPMethod, endpoint: T, urlParams: [String: String], bodyParams: [String: String], queryParams: [String: String]) -> Promise<U>
теперь у Swift достаточно информации, чтобы знать, как вы планируете использовать endpoint.
Ответ №2:
Попробуйте это:
struct RecognitionService: RecognitionServiceProtocol {
let httpClient: HTTPClientProtocol = HTTPClient<FeedsEndpoint, Recognition>()
}