Search code examples
iosswiftalamofirensurlrequest

Alamofire 4.0 Router Type of expression is ambiguous without more context


I'm in the process of converting to Swift 3.0, and have a custom Router class for Alamofire. My code is as follows:

enum Router: URLRequestConvertible {

    case get(query: String, params: [String: AnyObject]?)
    case post(query: String, params: [String: AnyObject]?)
    case put(query: String, params: [String: AnyObject]?)
    case delete(query: String, params: [String: AnyObject]?)

    var urlRequest: NSMutableURLRequest {

        // Default to GET
        var httpMethod: HTTPMethod = .get

        let (path, parameters): (String, [String: AnyObject]?) = {
            switch self {
            case .get(let query, let params):
                // Set the request call
                httpMethod = .get
                // Return the query
                return (query, params)
            case .post(let query, let params):
                // Set the request call
                httpMethod = .post
                // Return the query
                return (query, params)
            case .put(let query, let params):
                // Set the request call
                httpMethod = .put
                // Return the query
                return (query, params)
            case .delete(let query, let params):
                // Set the request call
                httpMethod = .delete
                // Return the query
                return (query, params)
            }
        }()


        // Create the URL Request
        let urlRequest: NSMutableURLRequest
        if let url =  URL(string: Globals.BASE_URL + path) {
            urlRequest = NSMutableURLRequest(url: url)
        } else {
            urlRequest = NSMutableURLRequest()
        }

        // set header fields
        if let key = UserDefaults.standard.string(forKey: Globals.NS_KEY_SESSION) {
            urlRequest.setValue(key, forHTTPHeaderField: "X-XX-API")
        }

        // Add user agent
        if let userAgent = UserDefaults.standard.string(forKey: Globals.NS_KEY_USER_AGENT) {
            urlRequest.setValue(userAgent, forHTTPHeaderField: "User-Agent")
        }

        // Set the HTTP method
        urlRequest.httpMethod = httpMethod.rawValue

        // Set timeout interval to 20 seconds
        urlRequest.timeoutInterval = 20

        return Alamofire.URLEncoding().encode(urlRequest as! URLRequestConvertible, with: parameters)
    }

    func asURLRequest() throws -> URLRequest {
    }
}

This is giving me an error stating Type of expression is ambiguious without more context at Alamofire.URLEncoding(). What does this mean?

Within the Alamofire docs at https://github.com/Alamofire/Alamofire/blob/master/Documentation/Alamofire%204.0%20Migration%20Guide.md#parameter-encoding-protocol, they have the code

public protocol ParameterEncoding {
    func encode(_ urlRequest: URLRequestConvertible, with parameters: Parameters?) throws -> URLRequest
}

Solution

  • This is nearly a duplicate of How to migrate Alamofire router class to Swift 3? Check it out and you'll see how to use the new ParameterEncoding and especially that URLRequestConvertible is now implemented with a func asURLRequest() throws -> URLRequest and not a var anymore.