Какой тип struct.self в swift? - PullRequest
0 голосов
/ 12 января 2020

У меня есть структурная переменная, которая расширяет протокол 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

Но какой бы тип я ни пытался, он не работает.

Какой тип мне там поставить? Или, может быть, есть другие решения?

1 Ответ

0 голосов
/ 12 января 2020

Вы можете объявить свойство

private var type: Codable.Type

или обернуть метод в обобщенную c структуру или класс и объявить свойство

class CodableWrapper<T : Codable> {

    private var type: T.Type
    ...
...