Получение обещания <Void>вместо NSMutableURLRequest - PullRequest
0 голосов
/ 04 ноября 2018

Я пытаюсь войти в свое приложение, однако все мои запросы APIR отображаются как Void вместо APIRequest. Эта функция работала в Swift 2 и с тех пор претерпела некоторые незначительные изменения, пытаясь перейти с PromiseKit 4 на PromiseKit 6.

Эта функция касается многих других вещей, пожалуйста, оставьте комментарий, если вам нужно больше информации. Функция выдачи мне ошибок:

class func recover403(error: Error) -> Promise<NSData> {
        if case let APIError.InvalidToken(request) = error {
            // Log in, then continue the promise chain
            let login = RootViewController.sharedInstance.showLoginController()
            return login.then { request -> Promise<NSData> in
                return API.transmit(request: request as! APIRequest)
            }
        } else if case CocoaError.userActivityConnectionUnavailable = error {

            let vc = ErrorViewController(nibName: "ErrorViewController", bundle: nil)
            let actions = ["Try Again"]

            vc.actions = actions
            vc.promise.then { index -> Promise<NSData> in
                RootViewController.sharedInstance.popAlertViewController()
                return API.transmit(request: request as! APIRequest)
            }.catch({ (Error) in
                // No catch
            })

            RootViewController.sharedInstance.pushAlertViewController(nvc: vc)
            vc.errorLabel.text = "Please check your network connection and try again!"
        }
        return Promise<NSData>(error: error)
    }

'return API.transmit (запрос: запрос как! APIRequest)' выбрасывает

Error: Value of tuple type 'Void' has no member 'value'
Warning: Cast from 'Void' to unrelated type 'APIRequest' always fails

2-й «возврат API.transmit (запрос: запрос как! APIRequest)» выбрасывает

Error: Generic parameter 'T' could not be inferred
Warning: Cast from '(String, Any?) -> Promise<_>' to unrelated type 'APIRequest' always fails

Вот APIRequest.swift

import Foundation

class APIRequest: NSMutableURLRequest {

    var errorConditions: [APIRequestErrorCondition] = []

    init(_ path: String, JSON: Any? = nil) {
        let URL = NSURL(string: API.baseURL + path)!
        super.init(url: URL as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 60)

        // Settings for both GET and POST
        setValue(API.agent, forHTTPHeaderField: "User-Agent")
        setValue("application/json", forHTTPHeaderField: "Accept")

        // Settings for POST, which is assumed when JSON != nil
        if let JSON = JSON {
            httpMethod = "POST"
            httpBody = try! JSONSerialization.data(withJSONObject: JSON, options: [])
            setValue("application/json", forHTTPHeaderField: "Content-Type")
        }
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

}

И, наконец, функция передачи:

class func transmit(request: APIRequest) -> Promise<NSData> {
    request.auth()
    return Promise<NSData> { seal in
        let task = URLSession.shared.dataTask(with: request as URLRequest, completionHandler: { (_data, _response, _error) in
            if let data = _data {
                seal.fulfill(data as NSData)
            } else if let error = _error {
                if case URLError.badServerResponse = error, let rsp = _response as? HTTPURLResponse {
                    seal.reject(BadUrlError.badResponse(rsp.statusCode))
                } else {
                    seal.reject(error)
                }
            } else {
                seal.reject(PMKError.invalidCallingConvention)
            }
            seal.fulfill(_data! as NSData)
        })
        task.resume()
    }
}

Эта ошибка очень сильно затрагивает, так что дайте мне знать в комментариях, если отсутствует раздел, который вам нужно увидеть!

Добавлено: объявление запроса

class func request<T>(path: String, JSON: Any? = nil) -> Promise<T> {
    let request = APIRequest(path, JSON: JSON)
    request.errorConditions = [API.InvalidTokenCondition, API.BadResponseCodeCondition]
    return API.promise(request: request)
}

Добавлено: объявление 'login'

func showLoginController() -> Promise<Void> {
    if let vc = modalController.vcs.last as? LoginViewController {
        return vc.promise
    }
    let vc = LoginViewController(nibName: "LoginViewController", bundle: nil)
    pushModalViewController(nvc: vc, animated: true)
    return vc.promise
}
...