SwiftUI .task调用async throws网络方法报类型不匹配错误如何解决
错误根因
报错是因为SwiftUI的.task修饰符仅接受非抛错类型的异步闭包(对应类型@Sendable () async -> Void),你在闭包内直接调用了带throws标记的fetchPopularMovies()方法,且未在闭包内部捕获处理抛出的错误,相当于把会抛错的闭包传给了要求非抛错闭包的入参,触发类型不匹配错误。
修复方式
在.task闭包内部通过do-catch处理所有可能抛出的错误,禁止错误逃逸到闭包外部即可。
修改后的视图代码:
struct MoviesScrollView: View { @Binding var movies: [Result] var movieListType: String var body: some View { VStack { ScrollView(.horizontal, showsIndicators: false) { LazyHStack { ForEach(movies, id: \.id) { movie in PosterView(movie: movie) } } .padding(.leading) .padding(.trailing) } } .task { do { movies = try await NetworkManager.shared.fetchPopularMovies() } catch { // 可根据业务需求补充错误处理逻辑,如展示错误提示、打印日志 print("热门电影加载失败: \(error.localizedDescription)") // 按需给movies赋值兜底值,避免页面状态异常 // movies = [] } } } }
可选优化
你当前的网络请求方法存在错误被吞的问题:JSON解码时使用了try?会忽略解码抛出的具体错误,直接走到方法末尾抛出通用错误,不利于排查问题,建议去掉try?让解码错误能被正常捕获:
func fetchPopularMovies() async throws -> [Result] { guard let url = URL(string: "https://api.themoviedb.org/3/movie/popular?api_key=\(apiKey)&language=en-US&page=1") else { print("请求URL构造失败") throw AError.genericError } do { let (data, _) = try await URLSession.shared.data(from: url) // 移除try?,正常抛出解码错误 let decodedResponse = try JSONDecoder().decode(PopularMovieResults.self, from: data) print("热门电影请求成功") return decodedResponse.results } catch { print("热门电影请求失败: \(error)") throw AError.genericError } }
内容的提问来源于stack exchange,提问作者MohAliBou
相关产品推荐
相关产品推荐

