【问题标题】:SwiftUI How to fix "Unable to infer complex closure return type; add explicit type to disambiguate"SwiftUI 如何修复“无法推断复杂的闭包返回类型;添加显式类型以消除歧义”
【发布时间】:2020-03-28 08:48:49
【问题描述】:

我不知道如何修复此错误“无法推断复杂的闭包返回类型;添加显式类型以消除歧义”。我已经尝试了everythink(我能做到的)并且不起作用

import SwiftUI  

struct ContentView: View {  

    @State var content: String = "start"  


    var body: some View {  

        VStack { // Unable to infer complex closure return type; add explicit type to disambiguate  

            self.content = try! String(contentsOf: URL(string: "http://zyglarski.pl/swift-http-docs/tinder_list.php")!)  

            var contentData = self.content.data(using: .utf8)  
            var jsDec = JSONDecoder()  
            var responce = try! jsDec.decode(Candidates.self, from: contentData!)  

            Text(responce)  
        }  
    }  
}  

struct ContentView_Previews: PreviewProvider {  
    static var previews: some View {  
        ContentView()  
    }  
}  


struct Candidates: Codable {  
    let candidates:[Candidate]  
}  
struct Candidate: Codable {  
    let filename: String  
    let name: String  
    let age: String  
    let distance: String  
    let match: String  
} 

请帮忙

【问题讨论】:

    标签: swift xcode swiftui


    【解决方案1】:

    作为克里斯回答的补充:

    让我们来看看闭包。一个“正常”的闭包,我们可以看到 .map { ... } 带有数组,它对列表的每个元素应用一个函数,并返回一个带有结果的新列表,如下所示:

    let myArray = [1, 2, 3, 4, 5]
    let tenTimes = myArray.map { (element) -> (Int) in
        return element * 10
    }
    // tenTimes is [10, 20, 30, 40, 50]
    

    (element) -> (Int) in 的意思是:我们得到一个参数并将其命名为element,这样我们就可以在闭包中使用它,闭包的返回类型是Int

    通常,我们对那一小段代码的第二行使用速记版本:

    let tenTimes = myArray.map { element in
    

    在这种情况下,Swift 可以推断出返回类型。

    但是从(我相信)Swift 5.1 开始,有一个新规则:当函数/变量/闭包的内容只有一行代码时,我们不需要显式写@987654329这个词@. 所以在上面的例子中,我们也可以说:

    tenTimes = myArray.map { element in
        element * 10
    }
    

    您在 SwiftUI 中看到的几乎每个 {} 都意味着您正在使用闭包。关于 return 关键字的最后一条规则在 SwiftUI 中经常应用。

    但还有别的:SwiftUI 中的闭包是特殊的 @ViewBuilder 闭包。因此,您可以将多个 View 放在另一个 View 中,就像在其中拥有多个 returns 的函数一样。但是当你使用其他代码时,比如let 语句,事情就会变得一团糟。 SwiftUI 不明白你想要什么。
    有时你可以通过使用显式的return 来帮助它一点,但通常错误只是转移到另一个地方。有一个机会,经过大量的困惑,你会得到它的工作,但我可以向你保证,它不会是漂亮的代码。因此,我会选择 Chris 的解决方案。

    Edit 2021:我对“具有多个返回语句的函数”很幼稚。更复杂的事情正在发生。该视频解释了究竟是什么:https://developer.apple.com/videos/play/wwdc2021/10253/
    这也可以澄清为什么将其他语句放在这些特殊闭包中不起作用。


    如果你想了解更多关于闭包的信息,这里是官方文档的链接:https://docs.swift.org/swift-book/LanguageGuide/Closures.html。非常有趣,但信息量很大!

    【讨论】:

      【解决方案2】:

      请阅读 swiftui 初学者教程,因为你犯了很多初学者错误。

      如果需要快速帮助,请查看:

      struct ContentView: View {
      
      
          @State var content: String = "start"
          @State var responce : String = ""
          @State var candidates : Candidates = Candidates(candidates: [])
      
          var body: some View {
      
              VStack { // Unable to infer complex closure return type; add explicit type to disambiguate
      
      
      
                  Text(responce)
                      .onAppear() {
                          self.content = try! String(contentsOf: URL(string: "http://zyglarski.pl/swift-http-docs/tinder_list.php")!)
      
                          var contentData = self.content.data(using: .utf8)
                          var jsDec = JSONDecoder()
                          self.candidates = try! jsDec.decode(Candidates.self, from: contentData!)
                  }
      
              }
          }
      }
      
      struct ContentView_Previews: PreviewProvider {
          static var previews: some View {
              ContentView()
          }
      }
      
      
      struct Candidates: Codable {
          let candidates:[Candidate]
      }
      struct Candidate: Codable{
          let filename: String
          let name: String
          let age: String
          let distance: String
          let match: String
      }
      

      【讨论】:

      • 最好让他知道自己的错误,让他从中吸取教训
      • 我知道,但它看起来像是他的第一个 swiftui 项目,有时我们都希望成功(yippie,它正在运行),因为我们不知道错误是什么......我已经告诉他阅读初学者教程,我厌倦了解释非常基本的事情,比如你不能在体内编写代码......等等
      猜你喜欢
      • 2020-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多