I'm attempting to login to my app, however, all my APIRequests are showing as Void instead of APIRequest. This function was working back in Swift 2 and has since gone through some minor changes to attempt to migrate from PromiseKit 4 to PromiseKit 6.
The function does touch a lot of other things, please leave a comment if you need to see more. The function giving me the errors is:
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(request: request as! APIRequest)' is throwing
Error: Value of tuple type 'Void' has no member 'value'
Warning: Cast from 'Void' to unrelated type 'APIRequest' always fails
the 2nd 'return API.transmit(request: request as! APIRequest)' is throwing
Error: Generic parameter 'T' could not be inferred
Warning: Cast from '(String, Any?) -> Promise<_>' to unrelated type 'APIRequest' always fails
Here is the 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")
}
}
And finally the transmit function:
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()
}
}
This error touches a lot, so let me know in the comments if there's a section missing that you need to see!
Added: 'request' declaration
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)
}
Added: 'login' declaration
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
}