Я пытаюсь войти в свое приложение, однако все мои запросы 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
}