You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 20:57:40