У меня есть структурная переменная, которая расширяет протокол Codable, и я хочу запомнить его тип, чтобы я мог использовать его в следующий раз в JSONDecoder. Однако, когда объявлена закрытая переменная, ее класс должен быть указан, но какой бы класс я ни пытался использовать, я не смогу использовать результат позже в JSONDecoder. Итак, мой вопрос, что это за тип myVariable.self?
У меня есть эта проблема, потому что я хочу указать класс при инициализации декодера представления. Во время инициализации я вызываю следующую функцию (эта часть кода работает хорошо):
func getData<T: Codable>(fromURL: String, onSuccess: @escaping (T) -> Void, onError: @escaping (String) -> Void) {
let url = URL(string: fromURL)!
let task = session.dataTask(with: url) {(data, response, error) in
DispatchQueue.main.async {
if let error = error {
onError(error.localizedDescription)
return
}
guard let data = data, let response = response as? HTTPURLResponse else {
onError("Invalid data or response")
return
}
do {
if response.statusCode == 200 {
let ret = try JSONDecoder().decode(T.self, from: data)
onSuccess(ret)
} else {
let err = try JSONDecoder().decode(APIError.self, from: data)
onError(err.message)
}
} catch {
onError(error.localizedDescription)
}
}
}
task.resume()
}
Эта часть кода работает хорошо. Однако, если мне нужно загрузить больше данных, мне нужно знать T.self для правильного декодера, поэтому я должен сохранить его. Решением может быть создание закрытой переменной:
private var type: ??? // what type should I put here?
и запись в тело функции
type = T.self
Но какой бы тип я ни пытался, он не работает.
Какой тип мне там поставить? Или, может быть, есть другие решения?