如何使用 Do-Try-Catch 修复“从 X 类型的抛出函数到 Y 类型的非抛出函数的无效转换”
Posted
技术标签:
【中文标题】如何使用 Do-Try-Catch 修复“从 X 类型的抛出函数到 Y 类型的非抛出函数的无效转换”【英文标题】:How to fix "Invalid conversion from throwing function of type X to non-throwing function type Y" with Do-Try-Catch 【发布时间】:2019-09-16 16:40:09 【问题描述】:我收到错误:从“(_) throws -> ()”类型的抛出函数到非抛出函数类型“(Either) -> Void”的无效转换
在do
、weatherApi.weather(with: weatherEndpoint) (either) in
之后上线
class WeatherTableViewController: UITableViewController
var cellViewModels = [WeatherCellViewModel]()
override func viewDidLoad()
super.viewDidLoad()
let weatherApi = WeatherAPIClient()
let weatherEndpoint = WeatherEndpoint.fiveDayForecast(city: "Atlanta", country: "us")
do
weatherApi.weather(with: weatherEndpoint) (either) in
switch either
case .value(let Weather):
print("Made it")
print(Weather)
let data = try Weather.map
$0.weather.map
WeatherCellViewModel(description: $0.description)
print("data")
print(data)
DispatchQueue.main.async
self.tableView.reloadData()
case .error(let error):
print(error)
catch
print("weather endpoint error")
我在最初遇到相同的错误并查看类似问题的答案后添加了 do try catch,但它并没有解决它。 try 块是导致错误的关键部分,我正在解析我的数据以获取描述。
【问题讨论】:
【参考方案1】:do-catch
当前位于包含 try
语句的闭包之外。
您需要将do-catch
移动到闭包中。错误是因为 weather
期望的闭包不会抛出,但它会继续抛出。
【讨论】:
【参考方案2】:你想从闭包中抛出,这是不可能的。所以你需要将do-catch
放入闭包中
试试这个方法:
do
let data = try Weather.map
$0.weather.map
WeatherCellViewModel(description: $0.description)
catch let error as NSError
print(error)
【讨论】:
以上是关于如何使用 Do-Try-Catch 修复“从 X 类型的抛出函数到 Y 类型的非抛出函数的无效转换”的主要内容,如果未能解决你的问题,请参考以下文章
《从零开始学Swift》学习笔记(Day 53)——do-try-catch错误处理模式
如何修复'ValueError:shapes(1,3)和(1,1)未对齐:3(dim 1)!= 1(dim 0)'numpy中的错误
如何找到方法可能抛出的错误类型并在 Swift 中捕获它们 [重复]
如何使用 scrollView 修复背景图像和使用 edittext 修复 textviews