我正在尝试构建一个泛型函数,以在URLSession的dataTask完成后返回给定类型的数组。
我有这个可分解物品:
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
没有指定返回类型的事实是原因,但我不明白为什么。是否可以提供足够的上下文来编译此代码?
我正在尝试构建一个泛型函数,以在URLSession的dataTask完成后返回给定类型的数组。我有以下代码:struct Todo:可哈希,可编码,可标识{var ...
您必须声明
在loadFrom(url:memberType:completionHandler:)
方法中,