SwiftUI调用API报错:‘can not find error in scope’求助
解决SwiftUI中"can not find error in scope"及代码问题
你的代码存在几个编译错误,下面逐一说明并给出修正方案:
变量作用域错误
url是fetch()函数内部的局部变量,类顶层的task无法访问这个变量,这是导致编译报错的核心原因。必须把dataTask的创建逻辑放到fetch()函数内部,和url处于同一作用域。闭包语法错误
dataTask的尾随闭包参数应该用逗号分隔,你写的data; error; in是错误写法,正确格式是data, error in。未启动网络任务
创建dataTask后必须调用resume()方法,否则网络请求不会实际执行。
修正后的完整代码:
import SwiftUI class ViewModel: ObservableObject { func fetch() { guard let url = URL(string: "http://www.themealdb.com/api/json/v1/1/search.php?s=Arrabiata") else { print("无效的URL") return } // 将dataTask移至fetch函数内部,确保能访问到url let task = URLSession.shared.dataTask(with: url) { data, error in // 处理请求错误 guard let data = data, error == nil else { print("请求失败: \(error?.localizedDescription ?? "未知错误")") return } // 这里添加JSON解析逻辑 do { // 示例:假设你有对应API返回结构的Codable模型 // let response = try JSONDecoder().decode(MealResponse.self, from: data) // DispatchQueue.main.async { // // 切换到主队列更新UI相关的@Published变量 // } print("成功获取数据,数据长度: \(data.count)") } catch { print("JSON解析失败: \(error.localizedDescription)") } } // 启动网络请求任务 task.resume() } } // 示例:对应API返回结构的Codable模型(可根据实际需求调整) // struct MealResponse: Codable { // let meals: [Meal] // } // // struct Meal: Codable { // let idMeal: String // let strMeal: String // let strMealThumb: String // // 按需添加其他API返回字段 // }
额外新手提示:
- 网络请求是异步操作,若要更新UI(比如给
@Published变量赋值),必须通过DispatchQueue.main.async切换到主队列,否则会引发崩溃。 - 建议使用Swift的
Codable协议解析JSON,这是处理JSON数据的标准方式。 - 若在iOS环境下运行,需要在
Info.plist中配置NSAppTransportSecurity,允许HTTP请求(因为你使用的是http协议),否则系统会拦截请求。
内容的提问来源于stack exchange,提问作者Jenny
相关产品推荐
相关产品推荐

