【问题标题】:Task{} works but .task{} throws Invalid conversion from throwing function of type error?Task{} 有效但 .task{} 抛出类型错误的抛出函数的无效转换?
【发布时间】:2023-01-25 03:15:07
【问题描述】:

我试图了解为什么 Task{} 有效,但是当我使用 VStack{}.task{} 执行此操作时,我收到错误消息:

Invalid conversion from throwing function of type '@Sendable () async throws -> ()' to non-throwing function type '@Sendable () async -> Void'

我试图让 fetchWeather() 函数在视图启动时运行,而无需用户点击按钮。 (如果下面的方法是正确的方法)但是遇到了这个错误并且我真的很好奇这个错误背后的原因

下面是我的代码:

struct WeatherView: View {
    var body: some View {
        VStack{
           Text("Hello, World!")
           Button("Get Weather", action: {
            // Works when I tap the button
//                Task {
//                    try await fetchWeather()
//                }
        })
    }
    //*******Xcode error with invalid conversion*******
    .task {
        try await fetchWeather()
    }
  }
}

struct WeatherView_Previews: PreviewProvider {
   static var previews: some View {
       WeatherView( )
   }
}

功能:

func fetchWeather () async throws  {
   let URLString = "https://api.openweathermap.org/data/2.5/weather?appid=someAPIKeyshere&q=seattle"
   let (data, response) = try await URLSession.shared.data(from:  URL(string: URLString)!)
   guard let httpResponse = response as? HTTPURLResponse,
      httpResponse.statusCode == 200 else {
          throw ResponseError.someError
      }
   let decodedResponse = try? JSONDecoder().decode(WeatherData.self, from: data)
   print("This is in decodedResponse: \(decodedResponse)")
}

提前致谢!

【问题讨论】:

    标签: swift swiftui async-await


    【解决方案1】:

    查看您收到的错误消息……

    你的函数是这样的类型:

    @Sendable () async throws -> ()
    

    而 .task 修饰符期待......

    @Sendable () async -> Void
    

    区别在于throws。

    您需要处理函数抛出的错误,例如……

    .task {
        do {
            try await fetchWeather()
        } catch {
            // handle error
        }
    }
    

    【讨论】:

      【解决方案2】:

      这是Task{} 的已知行为。它隐藏了结果中的错误,并且可以具有未处理的 throwing 函数。 .task 修饰符没有。如果你想在其中使用throwing函数,你需要用do/catch块来处理它们。

      .task {
          do{
              try await fetchWeather()
          } catch{
          }
      }
      

      您可以在 swift 论坛上read 了解该问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-19
        • 2016-10-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-19
        相关资源
        最近更新 更多