В моем приложении несколько контроллеров имеют очень похожую структуру кода, различия минимальны, поэтому для оптимизации я решил создать основу для этих контроллеров и наследовать каждый указанный c контроллер от базы.
У меня есть функция для отправки сетевых запросов и обработки ответа, я передаю структуру ответа в качестве параметра этой функции, чтобы функция возвращала мне готовую структуру ответа. Каждая такая структура имеет вид Decodable
.
Пример такой структуры:
struct APIAnswerUserActivity: Decodable {
let status: String
let code: Int?
let data: [UserActivity]?
let total: Int?
}
Функция для сетевых запросов, объект (структура) типа Decodable.Protocol
принимается как jsonType
параметр:
public func networkRequest<T: Decodable> (
url: String,
timeout: Double = 30,
method: URLMethods = .GET,
data: [String : String]? = nil,
files: [URL]? = nil,
jsonType: T.Type,
success: @escaping (T) -> Void,
failure: @escaping (APIError) -> Void
) -> URLSessionDataTask { ... }
В главном контроллере есть несколько параметров, которые я переопределяю с помощью переопределения в дочерних контроллерах, один из этих параметров должен быть объектом типа Decodable
, чтобы общая функция могла получить данные правильно. JSON структуры ответа очень похожи, но все же немного отличаются, общая структура для них не может быть создана, потому что данные все еще немного отличаются.
Если в главном контроллере сделать это:
public var decodableType: Decodable.Type {
return APIAnswerUserActivity.self
}
Это сработает, и можно переопределить типы, но сетевая функция не принимает это, ей нужен объект Decodable.Protocol
. Если для переменной decodableType
указан тип decodable.Protocol
, то больше невозможно добавить APIAnswerUserActivity.self
, что спокойно принимается при вызове функции networkRequest.
Как быть в этой ситуации ? Надеюсь, мне удалось правильно и четко изложить суть моей проблемы. Спасибо!