расшифровка кодируемого в Swift - PullRequest
0 голосов
/ 02 декабря 2018

Возникли проблемы с выполнением этого: я пытаюсь абстрагировать JSON-декодирование в функцию, принимая в качестве аргументов Codable плюс некоторые данные.

Поэтому для этого мне нужно иметь следующую сигнатуру функции:

func doTheJSONDecoding(cdbl: Codable, data: Data) {...}

Вот мой код, начиная с модели данных.Ниже приведены два примера ....

import UIKit
import Foundation

struct MyStructCodable : Codable {
    let items : [MyValue]?
}

struct MyValue : Codable {
    let value : String?
}

let dta: Data = """
{
  "items": [
    {
      "value": "Hello1"
    }
  ]
}
""".data(using: .utf8)!

Затем два примера:

// Example 1: this code works fine !!!!!!!!!!!!!!!!!!!!!!!!

let decoder = JSONDecoder()
do {
    let result = try decoder.decode(MyStructCodable.self, from: dta)
    print(result.items?[0].value ?? "")
} catch {
    print(error)
}

// above code prints:   Hello1


// Example 2: this code does not work - WHY ???????????????

func doTheJSONDecoding(cdbl: Codable, data: Data) {
    let decoder = JSONDecoder()
    do {
        let result = try decoder.decode(cdbl, from: data)
        print(result.items?[0].value ?? "")
    } catch {
        print(error)
    }
}

let myValue = MyValue(value: "Hello2")
let myStructyCodable = MyStructCodable(items: [myValue])
doTheJSONEncoding(cdbl: myStructyCodable, data: dta)

В функции выдается сообщение об ошибке:

enter image description here

Есть ли способ сохранить подпись функции (т. Е. func doTheJSONDecoding(cdbl: Codable, data: Data) и при этом заставить ее работать)? Любая помощь приветствуется.

1 Ответ

0 голосов
/ 02 декабря 2018

Вот моя попытка заставить ваш функционал работать, возможно, его можно улучшить, но он возвращает правильно декодированный объект.Обратите внимание, что он принимает тип объекта, а не объекта, и именно этот тип T реализует Decodable.

func doTheJSONEncoding<T: Decodable>(cdbl: T.Type, data: Data) -> T? {
    let decoder = JSONDecoder()
    do {
        let result = try decoder.decode(cdbl.self, from: data)
        return result
    } catch {
        print(error)
    }
    return nil
}

//testing it
let myValue = MyValue(value: "Hello2")
let myStructyCodable = MyStructCodable(items: [myValue])
let decoded = doTheJSONEncoding(cdbl: MyStructCodable.self, data: dta)
print(decoded?.items?[0].value ?? "")
...