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 或错误。”)