Swift 泛型无法推断泛型参数
Swift Generics Generic parameter could not be inferred
我正在尝试创建一个具有通用参数函数的协议。
protocol APIRequest {
static func fetchData<T: Codable>(completion: @escaping(T?, NetworkError?) -> Void)
}
然后我有一个符合协议的结构
static func fetchData<Ztar: Codable>(completion: @escaping (Ztar?, NetworkError?) -> Void) {
let url = URLConstructor.url(scheme: "https", host: "swapi.dev" , path: "/api")
guard let url = url else { return }
let task = URLSession.shared.dataTask(with: url) { data, response, error in
guard let data = data else {
completion(nil, NetworkError.badResponse)
return
}
do {
let decoder = JSONDecoder()
let object = try decoder.decode(Ztar.self, from: data)
completion(object, nil)
} catch {
print(error)
}
}
task.resume()
}
但我不确定泛型类型的实现是否正确,因为在我的 ViewController
中我收到错误 Generic parameter 'Ztar' could not被推断
NetworkManager.fetchData { star, error in
}
谁能解释一下我做错了什么?
无法正确实施。 Ztar是什么类型的?编译器怎么知道?你已经写了“fetchData
将从宇宙中所有无限可能的数据中获取某种数据,而你,编译器,应该解码它。”这不可能。
相反,通常的写法是:
fetchData<T: Codable>(ofType: T.Type, completion: @escaping (Result<T, NetworkError>) -> Void)
然后你需要传递你期望的类型作为第一个参数:
fetchData(ofType: Record.self) { resultRecord in ... }
如果你不知道Ztar是什么类型,编译器怎么知道?
(请注意,您几乎不应该使用 (T?, Error?)
作为类型。这表示“可能是 T,可能是 Error,可能两者都不是,可能都是。”您几乎总是指 Result<T, Error>
。那说“T 或错误。”)
我正在尝试创建一个具有通用参数函数的协议。
protocol APIRequest {
static func fetchData<T: Codable>(completion: @escaping(T?, NetworkError?) -> Void)
}
然后我有一个符合协议的结构
static func fetchData<Ztar: Codable>(completion: @escaping (Ztar?, NetworkError?) -> Void) {
let url = URLConstructor.url(scheme: "https", host: "swapi.dev" , path: "/api")
guard let url = url else { return }
let task = URLSession.shared.dataTask(with: url) { data, response, error in
guard let data = data else {
completion(nil, NetworkError.badResponse)
return
}
do {
let decoder = JSONDecoder()
let object = try decoder.decode(Ztar.self, from: data)
completion(object, nil)
} catch {
print(error)
}
}
task.resume()
}
但我不确定泛型类型的实现是否正确,因为在我的 ViewController
中我收到错误 Generic parameter 'Ztar' could not被推断
NetworkManager.fetchData { star, error in
}
谁能解释一下我做错了什么?
无法正确实施。 Ztar是什么类型的?编译器怎么知道?你已经写了“fetchData
将从宇宙中所有无限可能的数据中获取某种数据,而你,编译器,应该解码它。”这不可能。
相反,通常的写法是:
fetchData<T: Codable>(ofType: T.Type, completion: @escaping (Result<T, NetworkError>) -> Void)
然后你需要传递你期望的类型作为第一个参数:
fetchData(ofType: Record.self) { resultRecord in ... }
如果你不知道Ztar是什么类型,编译器怎么知道?
(请注意,您几乎不应该使用 (T?, Error?)
作为类型。这表示“可能是 T,可能是 Error,可能两者都不是,可能都是。”您几乎总是指 Result<T, Error>
。那说“T 或错误。”)