Swift泛型网络请求函数调用报错:Generic parameter 'T' could not be inferred问题排查咨询
解决Swift泛型网络请求函数的类型推断问题
你遇到的Generic parameter 'T' could not be inferred错误,本质是Swift编译器没法自动推断出泛型函数里T的具体类型。因为你调用fetchMovies时,闭包的参数moviesResponse被声明为T?,但编译器不知道T到底对应哪个Codable模型(比如NowPlayingResponse还是GenresResponse),所以需要你明确告诉它。
解决方案1:在闭包参数里显式指定类型
最直观的方法是在闭包的参数中直接标注类型,这样编译器就能立刻知道T是NowPlayingResponse:
func getMoviees(){ MovieServiceAPI.shared.fetchMovies(from: "https://api.themoviedb.org/3/movie/now_playing") { (moviesResponse: NowPlayingResponse?) in guard let safeMovies = moviesResponse?.results else {return} self.movieList = safeMovies DispatchQueue.main.async { [unowned self] in hideLoader() self.tableView.reloadData() } } }
解决方案2:调用函数时显式指定泛型类型
你之前尝试的方法语法有误,调用泛型函数时不需要再写类型约束(Codable已经在函数定义里声明过了),只需要直接指定具体类型即可:
func getMoviees(){ MovieServiceAPI.shared.fetchMovies<NowPlayingResponse>(from: "https://api.themoviedb.org/3/movie/now_playing") { (moviesResponse) in guard let safeMovies = moviesResponse?.results else {return} self.movieList = safeMovies DispatchQueue.main.async { [unowned self] in hideLoader() self.tableView.reloadData() } } }
额外优化建议
既然你的泛型函数已经支持任意Codable类型,建议把函数名从fetchMovies改成更通用的fetchData,这样语义更准确,也能避免后续调用时的混淆:
func fetchData<T: Codable>(from urlString: String, completion: @escaping (T?) -> Void){ guard let safeUrl = URL(string: urlString + apiKey) else { completion(nil) return } AF.request(safeUrl) .responseDecodable(of: T.self, decoder: jsonDecoder) { response in switch response.result { case .success: completion(response.value) case .failure(let error): print(error) completion(nil) } } }
调用的时候就可以写成:
MovieServiceAPI.shared.fetchData<NowPlayingResponse>(from: "...") { ... }
内容的提问来源于stack exchange,提问作者Marko Markovic
相关产品推荐
相关产品推荐

