Метод класса требует, чтобы AFDataResponse <X>соответствовал Encodable & Encodable - PullRequest
2 голосов
/ 07 мая 2020

Я читал здесь много вопросов, но ни один ответ не помог мне решить эту ошибку, моя структура Codable и использует только такие типы данных, как String, Int и Double.

У меня они есть отдельно 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]?
}

Вот где я получаю ошибку

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

Это определение моего метода

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)

        })

    }

}

Я действительно не знаю, что Да, все вопросы, которые задавали люди, были решены, потому что они использовали Image или какой-либо другой тип данных, который не использует протокол Codable

1 Ответ

1 голос
/ 07 мая 2020

В API, который вы описали, закрытие onSuccess будет принимать значение Feature, а не значение AFDataResponse<Feature>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...