如何使用 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

如何修复高度:在 Firefox 中使用 flexbox 自动修复? [复制]

如何修复跨站点脚本(XSS)?我们可以使用 .htaccess 修复吗