iOS - Как кодировать класс DecodeHelper в Swift с помощью Generics? - PullRequest
0 голосов
/ 22 мая 2018

Я пытаюсь создать свой собственный класс DecodeHelper.

Вот где я борюсь:

final class DecodeHelper {

    static func myDecodeMethod<T>(data: Data, completion : (Result<T, ErrorResult>) -> Void) {

        do {
            let decoder = JSONDecoder()
            let decodedData = try decoder.decode(Forecast.self, from: data)
            completion(Result.success(decodedData))
        } catch {
            completion(Result.failure(.decoder(string: "Error while decoding json data")))
        }
    }
}

Этот метод будет вызываться в коммутаторе (только в случае успеха) после полученияданные из Backend.

Но я не знаю, как их кодировать в общем виде.Должен ли я передать ожидаемый тип в качестве параметра (Forecast.self здесь)?

Это не компилируется:

Cannot convert value of type 'Result<Forecast, _>' to expected argument type 'Result<_, ErrorResult>'

Любые советы приветствуются.

1 Ответ

0 голосов
/ 22 мая 2018

Вы довольно близки, вам просто нужно добавить требование, чтобы T было Decodable

final class DecodeHelper {

    static func myDecodeMethod<T: Decodable>(data: Data, completion : (Result<T, ErrorResult>) -> Void) {

        do {
            let decoder = JSONDecoder()
            let decodedData = try decoder.decode(T.self, from: data)
            completion(Result.success(decodedData))
        } catch {
            completion(Result.failure(.decoder(string: "Error while decoding json data")))
        }
    }
}
...