Swift报Cannot convert value of type '()'闭包类型转换错误如何解决
编译错误修复方案
报错信息:Cannot convert value of type
()to expected argument type(Data?, URLResponse?, Error?) -> Void
错误截图:
错误原因
- 传参逻辑错误:
completionHandler参数要求传入函数引用,你当前的写法是直接调用handel函数,调用函数的返回值是空类型(),和参数要求的函数类型不匹配。 - 回调参数类型错误:自定义的
handel函数第二个参数类型应为URLResponse?,你误写为URLSession?,和系统要求的回调参数类型不一致。
修正后代码
struct WeatherManager { let weatherURL = "" func fetchWeather(cityName : String){ let urlString = "\(weatherURL)&q=\(cityName)" performRequest(urlString: urlString) } func performRequest(urlString : String){ //1- 创建URL if let url = URL(string: urlString){ //2- 创建URLSession let session = URLSession(configuration: .default) //3- 给session分配任务,直接传入函数引用即可 let task = session.dataTask(with: url, completionHandler: handel) //4- 启动任务 task.resume() } } // 修正第二个参数的类型为URLResponse? func handel(data:Data? , urlResponse : URLResponse? , error : Error?){ if error != nil { print(error!) return } if let safeData = data{ let dataString = String(data: safeData, encoding: .utf8) print(dataString ?? "数据转字符串失败") } } }
可选简化写法
你也可以直接使用尾随闭包语法写回调逻辑,无需单独定义handel函数:
func performRequest(urlString : String){ if let url = URL(string: urlString){ let session = URLSession(configuration: .default) let task = session.dataTask(with: url) { data, response, error in if let error = error { print(error) return } guard let safeData = data else { return } print(String(data: safeData, encoding: .utf8) ?? "数据解析失败") } task.resume() } }
内容的提问来源于stack exchange,提问作者Huzaifa Aliyash
相关产品推荐
相关产品推荐


