Swift 4.2: тип «T» не соответствует протоколу «Decodable» - PullRequest
0 голосов
/ 01 октября 2018

У меня есть функция, вызывающая URL для получения данных в формате JSON.Для декодирования JSON в пользовательский класс я использую JSONDecoder.

fileprivate func loadFlux<T>(_ typeClass: T.Type, urlCriteria url: String) -> Promise<Any> {

    var dataFlux: [T]? = nil
    var promise: Promise<Any>? = nil

    ...

    let jsonData: Data = try! JSONSerialization.data(withJSONObject: data as! NSArray)

    let decoder = JSONDecoder()
    dataFlux = try decoder.decode([T], from: data)

    ...
}

Перед установкой последней версии Xcode и swift 4.2 сборка кода без проблем.

Но теперь я получаю следующее сообщение об ошибке: Type 'T' does not conform to protocol 'Decodable' в строке:

dataFlux = try decoder.decode([T], from: data)

Я пытался погуглить сообщение, но пока безуспешно.Любое предложение, чтобы решить эту проблему?

1 Ответ

0 голосов
/ 01 октября 2018

Этот код не мог быть скомпилирован даже в предыдущей версии Swift, поскольку JSONDecoder.decode ожидает, что его входной аргумент будет соответствовать Decodable, и у вас не установлены ограничения типа.Вам просто нужно ограничить T до Decodable.

fileprivate func loadFlux<T:Decodable>(_ typeClass: T.Type, urlCriteria url: String) -> Promise<Any> {

    var dataFlux: [T]? = nil
    var promise: Promise<Any>? = nil

    ...

    let jsonData: Data = try! JSONSerialization.data(withJSONObject: data as! NSArray)

    let decoder = JSONDecoder()
    dataFlux = try decoder.decode([T].self, from: jsonData)

    ...
}

Без полного контекста я не могу точно сказать, что вы возвращаете из своей функции, но возвращение Promise<Any> из универсальной функции определенно выглядит какплохая идеяВы должны также сделать тип возвращаемого значения функции также универсальным.

...