Search code examples
swiftalamofiredecodable

AF no member 'responseDecodable' with router


Please help and explain why the router doesn't have responseDecodable. I made a router for AF request call and one of the endpoint need to send up String: [String: Any]. I'm not sure what I did wrong. Thank you!

AFRouter

enum AFRouter: URLRequestConvertible {
    case test([String: [String: Any]])

    var base: URL {
        return URL(string: "https://example.com")!
    }
    
    var method: HTTPMethod {
        switch self {
        case .test:
            return .get
    }
    
    var path: String {
        switch self {
        case .test(_):
            return "/v2/test"
        }
    }
    
    func asURLRequest() throws -> URLRequest {
        let urlString = baseURL.appendingPathComponent(path).absoluteString.removingPercentEncoding!
        let removeSpace = urlString.replacingOccurrences(of: " ", with: "")
        let url = URL(string: removeSpace)
        var request = URLRequest(url: url!)
        request.method = method
        
        switch self {
        case .test(_):
             guard let token = defaults.string(forKey: "token") else {
                 return request
             }
             
            request.setValue("Bearer " + token , forHTTPHeaderField: "Authorization")
            request = try JSONEncoding.default.encode(request)
        return request
    }
}

Codable

struct Test: Codable {
    let success: String
    let message: String
    let data: [String]
}

Calling API

func getTest(testInfo: [String: Any]) {
    AF.request(AFRouter.test(["Testing": testInfo]).responseDecodable(of: Test.self) { response in //got error here "Value of type 'AFRouter' has no member 'responseDecodable'"
        //do something...
    })
}

Solution

  • The error is saying that you want to use responseDecodable(of:) on a AFRouter instance. But, in fact, you want to use it on a DataRequest instance.

    But it "should work", so are you calling it on a mistaken instance? if we observe, there is a missing ):

    AF.request(AFRouter.test(["Testing": testInfo]).responseDecodable(of:...
    

    =>

    AF.request(AFRouter.test(["Testing": testInfo])).responseDecodable(of:...