Как я могу исправить протокол можно использовать только в качестве общего ограничения, потому что он имеет Self или связанные с требованиями к типу ошибки - PullRequest
0 голосов
/ 04 марта 2019

Я понимаю, что эти вопросы задавались много раз, однако я изо всех сил пытаюсь понять, как это можно отнести к моему сценарию.

Я надеюсь, что кто-то может сломать это для меня, чтобы я мог понять проблему и как ее исправить.

У меня есть протокол

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' может использоваться толькокак общее ограничение, потому что оно имеет требования к Self или связанные с ними типы

Является ли единственным решением сделать универсальный call func вместо класса?

Я не уверен, какисправить эту проблему.

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

Попробуйте это:

struct RecognitionService: RecognitionServiceProtocol {

  let httpClient: HTTPClientProtocol = HTTPClient<FeedsEndpoint, Recognition>()

}
0 голосов
/ 04 марта 2019

Попробуйте

func call<T: EndpointProtocol>(method: HTTPMethod, endpoint: T, urlParams: [String: String], bodyParams: [String: String], queryParams: [String: String]) -> Promise<U>

Теперь у Swift достаточно информации, чтобы знать, как вы планируете использовать конечную точку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...