Возникли проблемы с тем, чтобы заставить это работать: я пытаюсь абстрагировать 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)
Выброшенная ошибка находится внутри функции, она говорит:
Есть ли способ сохранить сигнатуру функции (т.е. func doTheJSONDecoding(cdbl: Codable, data: Data)
и все еще заставить ее работать? Любая помощь приветствуется.
doTheJSONDecoding()
. - Я явно хотел бы декодировать (не кодировать) - поэтому мне нужно сохранить JSONDecoder, я думаю. (т.е. у меня есть JSON-данные, и я хотел бы декодировать их в структуру). Более того, изменение сигнатуры функции наdoTheJSONDecoding(cable: Decodable, data: Data)
тоже не помогает...) - person iKK   schedule 02.12.2018cdbl
должен быть конкретным типом, а не протоколом. Вы можете использовать протокол как ограничение универсального. И не любой тип, соответствующийCodable
, имеетitems
. - person vadian   schedule 02.12.2018