Как передать Codable struct в качестве параметра функции при вызове Api - PullRequest
0 голосов
/ 13 февраля 2020

Я хотел бы спросить, как можно передать Codable struct в качестве параметра для функции при вызове Api, потому что каждый раз вы не можете создать отдельный метод для вызова одного и того же типа api из-за различной структуры как модели. Ниже мой код:

 func getTypeAPI(urlString: String, header: HTTPHeaders, completion: @escaping (MyTaskDetails?) -> Void) {

Мой вопрос, как я могу передать struct, а не name напрямую. Надеюсь, я прояснил свой вопрос. Это немного сложно спросить, потому что не получается получить правильные слова.

Обновление: я понял, что дженерики - правильный способ достичь этого

 func getType<T: Decodable>(urlString: String, header: HTTPHeaders, completion: @escaping (T?) -> Void){

 }

, но все же проблема здесь при звонке:

let networkManager = DataManager()

 networkManager.getType(urlString: kGetMyRoles, header: header){ ([GetMyDayAndTaskDetails]) in

Ошибка выдачи:

Cannot convert value of type '([RolesMain]) -> ()' to expected argument type '(_?) -> Void'

Структуры

struct RolesMain : Codable {
let data : [Roles]
}

struct Roles : Codable {
let roleId : Int?
let roleName, roleContent : String?

private enum Codingkeys: String, CodingKey
{
    case roleId = "roleId"
    case roleName = "roleName"
    case roleContent = "roleContent"

}
}

1 Ответ

0 голосов
/ 13 февраля 2020

добавить этот код расширение. тогда вы можете вызвать getParameters () из любой кодируемой структуры.

public extension Encodable {

    func getParameters() -> [String: Any] {
        do {
            let jsonEncoder = JSONEncoder()
            let jsonData = try jsonEncoder.encode(AnyEncodable(self))
            let json = try JSONSerialization.jsonObject(with: jsonData, options: []) as? Parameters
            if let jsonValue = json {
                return jsonValue
            }
        } catch { }

        return [String: Any]() 
    }
}
...