class method requires that 'AFDataResponse<X>' conform to Encodable & Encodable

Viewed 346

I've been reading many questions on here, but no answer helped me resolve this error, my struct is Codable and is only using data types like String, Int and Double.

I have them in separate files

struct Feature : Codable {
    var property: Properties?
    var geometry: Geometry?
}

struct Properties : Codable {
    let pk: Int
    var title: String = ""
    var name: String = ""
    //var added: Date
}

struct Geometry : Codable {
    var type: String = ""
    var coordinates: [Double]?
}

This is where I get the error

CommunicationManager.request(endpoint: "url", onSuccess: { (response: AFDataResponse<Feature>) in
        print(response)
    })

This is the definition of my method

import Alamofire

typealias APIHeaders = HTTPHeaders
typealias APIParameters = [String: Any]

enum APIMethod {
    case get
    case post
    case delete
    case put

    fileprivate var value: HTTPMethod {
        switch self {
        case .get:
            return HTTPMethod.get
        case .post:
            return HTTPMethod.post
        case .delete:
            return HTTPMethod.delete
        case .put:
            return HTTPMethod.put
        }
    }
}

enum APIEncoding {
    case json
    case url

    fileprivate var value: ParameterEncoding {
        switch self {
        case .json:
            return JSONEncoding.default
        default:
            return URLEncoding.default
        }
    }
}

class APIError {
    var code: String?
    var message: String?

    init(message: String) {
        self.code = nil
        self.message = message
    }
}

class APISessionManager: Session {
    static let shared: APISessionManager = {
        let configuration = URLSessionConfiguration.default
        configuration.timeoutIntervalForRequest = 40
        configuration.requestCachePolicy = .reloadIgnoringLocalAndRemoteCacheData
        let manager = APISessionManager(configuration: configuration)
        return manager
    }()
}

class CommunicationManager {

    class func request<T: Codable>(endpoint: String,
                       method: APIMethod = .get,
                       encoding: APIEncoding = .url,
                       parameters: APIParameters? = nil,
                       headers: APIHeaders? = nil,
                       onSuccess: @escaping (T) -> Void,
                       onFailure: ((APIError)-> Void)? = nil){

        let request = APISessionManager
            .shared
            .request(endpoint,
                     method: method.value,
                     parameters: parameters,
                     encoding: encoding.value,
                     headers: headers)

        request.responseJSON(completionHandler: { response in

            guard response.error == nil else {
                onFailure?(APIError(message: "error"))
                return
            }

            guard let data = response.data else {
                onFailure?(APIError(message: "error"))
                return
            }

            guard let object = try? JSONDecoder().decode(T.self, from: data) else {
                onFailure?(APIError(message: "error"))
                return
            }

            onSuccess(object)
            print(response)

        })

    }

}

I really don't know what to do, all the questions people asked were resolved because they used Image, or some other data type that does not use the protocol Codable

1 Answers

In the API you've described, the onSuccess closure would take a Feature value, not an AFDataResponse<Feature> value.

Related