Swift错误:抛出函数无法转换为非抛出函数类型问题咨询
错误原因及解决方案:Invalid conversion from throwing function...
嘿,这个问题我之前也碰到过,很容易搞明白:
核心错误原因
你在闭包里直接调用了try JSONDecoder().decode(...)——这个decode方法是带throws关键字的,意味着它可能会抛出错误。但你传给EduappRestClient.request的闭包类型要求是(JSON?, Error?) -> Void,这个类型的闭包是不允许抛出任何错误的。Swift的类型系统很严格,它不允许把一个可能抛出错误的闭包,赋值给要求非抛出的闭包参数,这就是你看到这个报错的根本原因。
修复方案
你需要用do-catch块来捕获decode可能抛出的错误,把错误处理逻辑包裹起来,不让错误“逃逸”出闭包。修改后的代码如下:
EduappRestClient.request(with: URLString, method: .post, parameters: parameters) { (json, error) in guard error == nil, let json = json else { completion(nil, error) return } do { let result = try JSONDecoder().decode(QuestionModel.self, from: json) completion(result, nil) } catch let decodeError { // 将解码过程中出现的错误传递给外部的completion completion(nil, decodeError) } }
额外提示
别忘了确认你的QuestionModel已经正确遵守了Decodable协议,并且模型的属性和JSON结构完全匹配,不然即使修复了这个类型错误,解码过程还是会抛出异常哦。
内容的提问来源于stack exchange,提问作者William Loke
相关产品推荐
相关产品推荐

