Я пытаюсь создать обобщенную функцию c, которая возвращает массив заданного типа после завершения dataTask URLSession.
У меня есть этот Decodable:
struct Todo: Hashable, Codable, Identifiable {
var id: Int
var title: String
var completed: Bool
}
И эта функция:
func loadFrom<T: Decodable>(url: String, memberType: T, completionHandler: (T?) -> Void) {
guard let url = URL(string: url) else {
completionHandler(nil)
}
URLSession.shared.dataTask(with: url) {data, response, error in
guard let data = data else {
fatalError("No data returned")
}
do {
let decoder = JSONDecoder()
let results = try decoder.decode(T.self, from: data)
completionHandler(results)
}catch {
fatalError("Couldn't parse data")
}
}.resume()
}
loadFrom(url: "https://jsonplaceholder.typicode.com/todos?completed=true", memberType: Todo) {response in
...
}
ошибка: Swift Scratchpad.playground: 61: 88: ошибка: аргумент тип 'Todo.Type' не соответствует ожидаемому типу 'Decodable'
Я встречал похожие проблемы, которые указывают на неспособность компилятора синтезировать методы, которые протокол Decodable требует для соответствия, но работает аналогичный метод, который назначен типу Decodable, а не указан в качестве параметра:
func loadFile<T: Decodable>(file: String) -> T {
...
}
var todos: [Todo] = loadFile(file: "todos.json")
print(todos[0].title) => "The todo title"
Я предполагаю, что причиной того, что мой loadFrom
не указал тип возвращаемого значения, является причина но я не понимаю почему. Можно ли предоставить достаточно контекста для этого кода для компиляции?